echo off
コマンドエコーバックを停止する。
→実行するコマンドの逐一表示を停止。
@echo off
echo エコーバック停止
コメント
REM コメント
変数
setで定義、%変数%で使用。
set x=TEST
echo %x%
環境変数と遅延環境変数
if() や for() のカッコ内ではデフォルトで環境変数が適用されるため注意が必要
遅延環境変数を使用する場合、setlocal enabledelayedexpansion から endlocal の間に記述し、
変数は「!変数!」で使用する。
@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
)
参考記事