ちょっとした事で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 | 引用符(“)を削除 | 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:0 | PATH変数のディレクトリを検索して最初に見つかった完全修飾名に展開 | C:\work\subwork\test of.bat |
変数名 | 説明 | 出力例 |
---|---|---|
%CD% | 現在のディレクトリ | C:\work |
%DATE% | 日付 | 2018/11/25 |
%TIME% | 時刻 | 3:00:26.72 |
%RANDOM% | 乱数(0~32767) | 29372 |
変数置換 | 説明 | 出力例 |
---|---|---|
%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 /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 [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 | ジャンプ |