DOSバッチ(bat)の環境変数

ちょっとした事でbatファイルを作成することが多い。
そのたびにネット検索するのが非効率なため、リファレンス化しようと思う。
そういう目的なので、自分がよく調べる項目に絞っている。

開発時の注意点

  • 直観的に「カレントディレクトリは、バッチファイルのあるディレクトリ」と勘違いすることが多い。タスクスケジューラ等のツールから実行する場合は正しいことがあるが、コマンドプロンプトからパス指定で実行する場合は正しくない。
    このように、実行方法によってカレントディレクトリが変わってしまわないよう、バッチの先頭処理で、カレントディレクトリを変更しておく。(cd /d “%~dp0”)
  • %0, %1系変数を使用する場合、状況によって引用符が入ったりすることを考慮しないと、引用符が入ってきた場合の変数の構築が崩壊する。
    これらの変数を別の変数に代入する場合は%~で引用符を外す。コマンド実行等の最終段では引用符を付けて変数を展開する。
    [code gutter=”false”]set BASE_FOLDER=%~dp0
    set LOG_FILE=%BASE_FOLDER%log.txt
    dir "%BASE_FOLDER%"
    echo hello > "%LOG_FILE%"
    [/code]

リファレンス

コマンド引数:
変数説明出力例
%0起動されたバッチファイルのパス。
実行時に指定された絶対パスまたは相対パスに展開される。空白を含むようなパスの場合、引用符も付与される。
「C:\work\test.bat arg1 arg2」の場合、「C:\work\test.bat」
「”C:\work\test of.bat” arg1 arg2」の場合、「”C:\work\test of.bat”」
%1第1引数の値。
同様に%2, %3は第2, 3引数の値。
引用符を付けて引数を指定した場合は引用符も含まれる。
「C:\work\test.bat arg1 arg2」の場合、%1は「arg1」、%2は「arg2」
「C:\work\test.bat “arg1a arg1b”」の場合、%1は「”arg1a arg1b”」
変数参照:
※変数参照は”%0″で記載しているが”%1″等でも同様
※出力例は、%0が「”subwork\test of.bat”」の場合を想定
※”For /?”で参照可

変数参照説明出力例
%~0引用符(“)を削除subwork\test of.bat
%~f0完全修飾パスC:\work\subwork\test of.bat
%~d0ドライブ文字のみC:
%~p0パス名のみ\work\subwork\
%~n0ファイル名のみ(拡張子はなし)test of
%~x0拡張子のみ.bat
%~s0短いファイルパスC:\work\subwork\TESTOF~1.BAT
%~a0ファイル属性–a——–
%~t0ファイルの日付/時刻2018/11/25 01:20
%~z0ファイルサイズ243
%~$PATH:0PATH変数のディレクトリを検索して最初に見つかった完全修飾名に展開 C:\work\subwork\test of.bat

動的環境変数:
※展開時に動的に設定される変数
変数名説明出力例
%CD%現在のディレクトリC:\work
%DATE%日付2018/11/25
%TIME%時刻 3:00:26.72
%RANDOM%乱数(0~32767)29372
変数置換:
※”set /?”で参照可
変数置換説明出力例
%V%(例題)ABCDEFG
%V:X=Y%XをYに置換%V:CD=cd% -> ABcdEFG
%V:*X=Y%XをYに置換(*:ワイルドカード)%V:*CD=bcd% -> bcdEFG
%V:~M,N%先頭のM文字目からN文字%V:~2,3% -> CDE
%V:~M,-N%先頭のM文字目から、最後からN文字目%V:~2,-1% -> CDEF
%V:~-N%最後からのM文字目以降%V:~-3% -> EFG
SETコマンド:
※”set /?”で参照可
表現説明出力例
SET /A 算術演算式算術演算の結果を代入する。
+-*/: 加算、減算、乗算、除算
%: 余剰(バッチ上では%%と記載)
(): グループ化
0xN: 16進数(Nは任意桁の0-9A-F)
0N: 8進数(Nは任意桁の0-7)
SET /A VAL1=(2+3*2)/2
SET /A VAL2=5%%3
SET /A VAL3=0x10+04
SET /A 論理シフト式論理シフトの結果を代入する。
<<: 左シフト
>>: 左シフト
SET /A “VAL1=1<<4"
SET /A “VAL2=-1<<2"
SET /A ビット演算式ビット演算の結果を代入する。
&: AND
|: OR
^: XOR
SET /A “VAL1=0xff & 07”
SET /A “VAL2=0xf0 | 0x0f”
SET /P 変数=[文字列]ユーザの入力内容を代入する。SET /P VAL=”$ “
条件判定・分岐:
※”if /?”で参照可
コード例説明
if [not] 文字列1==文字列2 ( command )文字列が一致
if [not] “文字列1″==”文字列2” ( command )文字列が一致
(空だった場合に文法エラーになるのを回避するため)
if [not] EXIST ファイル名 ( command )ファイルの存在確認
if [not] ERRORLEVEL 番号 ( command )エラー番号が番号以上
if [/I] 文字列1 EQU 文字列2 ( command )EQU: 等しい
NEQ: 等しくない
LSS: より小さい
LEQ: 以下
GTR: より大きい
GEQ: 以上
(/I: 大小文字無視)

その他

スニペット:
コード例説明
@echo off実行内容の出力を抑制
cd /d “%~dp0”カレントドライブ・フォルダ変更
pushd \\localhost\share

popd
ネットワークパスに一時的にCD
一時的にネットワークドライブを割り当てている。
popdでネットワークドライブを解除する。
echo.
echo[
echo(
空行の出力(左記のいずれか)
command > NUL 2>&1コマンドの実行結果
(標準出力/標準エラー出力)を捨てる。
無視できる出力がある場合に使用する。
call external.bat外部コマンドの実行
(callがないと非同期実行になってしまう。)
exit /b 0外部コマンド側での戻り値返却
(“/b”がないと呼出元も終了してしまう。)
set YMD=%date:/=%yyyymmdd形式の日付
例: 20180109
set FHMSN=%time: =0%
set FHMS=%FHMSN:~,8%
set HMS=%FHMS::=%
hhmmss形式の時刻
例: 230159
goto label

:label
ジャンプ