2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

bat 備忘録

Last updated at Posted at 2022-10-12

echo off

コマンドエコーバックを停止する。
→実行するコマンドの逐一表示を停止。

@echo off
echo エコーバック停止

コメント

REM コメント

変数

setで定義、%変数%で使用。

set x=TEST
echo %x%

環境変数と遅延環境変数

if() や for() のカッコ内ではデフォルトで環境変数が適用されるため注意が必要
遅延環境変数を使用する場合、setlocal enabledelayedexpansion から endlocal の間に記述し、
変数は「!変数!」で使用する。

sample.bat
@echo off
set x=TEST
if "%x%" == "TEST" (
   set x=SAMPLE 
   echo x1%x% 
) 
echo x2%x% 

setlocal enabledelayedexpansion
set y=TEST

if "%y%" == "TEST" (
   set y=SAMPLE
   echo y1!y!
) 
echo y2%y%
endlocal
pause

x1TEST
x2SAMPLE
y1SAMPLE
y2SAMPLE

うまくいかないとき

「!変数!」となっているか。
→遅延環境変数を使うときは「%変数%」ではなく「!変数!」

・「変数 = 値」のようにスペースが入りこんでいないか
→「変数=値」のように詰めて記述すること

/p 入力情報取得

@echo off
set /p answer=【/pテスト】_文字を入力してください。  

echo 入力した文字は %answer% です。
pause

if

@echo off
set /p answer=本を英語で何と言いますか? 
set judge=未判定

if %answer%==BOOK (
  set judge=正解
  echo Q1.変数の中身は?→ %judge%

) else if %answer%==book (
  set judge=正解
  echo Q1.変数の中身は?→ %judge%

) else (
  set judge=不正解
  echo Q1.変数の中身は?→ %judge%
)

  echo Q2.変数の中身は?→ %judge%
pause
比較演算子 判定
[文字列1] == [文字列2] ==
[数値1] equ [数値2] ==
[数値1] neq [数値2] not ==
[数値1] lss [数値2] <
[数値1] leq [数値2] =<
[数値1] gtr [数値2] >
[数値1] geq [数値2] =>

変数の中身は?

if文で変数に値を代入した際、代入の結果はif分を抜けてから反映される
→上記例文ではQ1:未判定、Q2に正解もしくは不正解

→ 環境変数と遅延環境変数

うまくいかないとき

REM 閉じカッコ「)」がif句の一番下にいないとプログラムが強制終了する
if %answer%==強制終了しない ( echo 強制終了しない
)

if %answer%==強制終了する ( echo 強制終了する)
) else if %answer%==失敗例 (
  REM 【注意】空白のブロックがあるとプログラムが強制終了する
)else if %answer%==失敗例(
  echo【注意】 REM 「(」の前と「)」の後には必ず半角スペースを記述

パラメータの有無を確認する際は""で囲う

「『""』がないと 『if =="" (』となり強制終了する。」

if "%~1"=="" (
	echo パラメータがありません。
	pause
	exit
)

for

同ディレクトリのファイル名一覧取得

for %%アルファベット1字 in (ディレクトリ) do (
処理
)
@echo off
for %%f in (*.bat) do (
echo ファイル名:%%f
)
pause

うまくいかないとき

・「in」が抜けていないか

変数加工

ループカウンタ

@echo off
rem ループカウンターを使うには事前に宣言が必要
setlocal enabledelayedexpansion
rem ループカウンターの初期化
set /a counter=0
for %%i in (a,b,c) do (
    set /a counter=counter+1
    echo !counter! : %%i
)
pause

再帰的に実行

for文に/rオプションを付けると再帰的に実行される。
例は入力した値で .py ⇔.py.txt を入れ替えるbat

@echo off
set /p answer="Prease select convert type you need: .py.txt:[1] .py:[0] >>>>>"
if %answer% EQU 1 (
	set before=*.py
	set after=.py.txt
) else if %answer% EQU 0 (
	set before=*.py.txt
	set after=
) else (
	exit
)
for /r %%i in (%before%) do (
	ren "%%i" "%%~ni%after%"
)

改行

「^」で改行

@echo off

echo^
^
^
^
ト

実行結果 > 改行テスト

中断

@echo off

echo 中断テスト
pause

パラメータ

コマンドで渡す方法とbatファイルにドラッグ アンド ドロップして渡す方法がある。

@echo off
 
echo 第1引数は「%1」です。
echo 第2引数は「%2」です。
echo 第3引数は「%3」です。

パラメータの加工

第1引数「%1」の例

コマンド 主な動作 表示例
%1 そのまま表示 C:\Users\user\Desktop\TEST.txt
%~1 ダブルクォーテーション「”」を除いて表示 C:\Users\user\Desktop\TEST.txt
%~d1 ドライブ名のみ表示 C:
%~p1 パス名のみ表示 \Users\user\Desktop\
%~n1 ファイル名のみ表示 TEST
%~x1 拡張子のみ表示 .txt
%~nx1 ファイル名.拡張子表示 TEST.txt
%~a1 ファイルの属性を表示 --a--------
%~t1 ファイルの更新日時を表示 2022/08/0503:11
%~z1 ファイルのサイズを表示 604

関数

・関数を呼び出し元より上に書くと「exit /b」でプログラムが終了になるので注意
・関数を呼び出し元より上に書いて「exit /b」を消すと無限ループになるので注意

@echo off

call :testSub
echo TEST2
exit /b

:testSub
echo TEST1
exit /b

パラメータの受け渡し

call 関数名 p1
%1で受け取る

@echo off
for %%f in (*.txt) do (
	call :testSub %%f
)
pause

:testSub
if "%1" neq "" (
	echo %1
)

参考記事

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?