変数
%0
バッチのフルパスが設定されている。
バッチの置かれているカレントディレクトリは、%~dp0
常にバッチが置かれているディレクトリをカレントディレクトリにしたいときは下記のようにする。
cd /d %~dp0
%1,%2,%3,…
指定された引数が設定されている。for
で%*
を使うと%1
以降の全ての引数が参照できる。コマンドライン引数を順次参照したいときに便利。
for %%f in (%*) do ( rem そのまま echo %%f rem ファイル名のみ echo %%~nf rem 拡張子のみ echo %%~xf rem 参考: https://pentan.info/server/windows/cmd/dp0.html )
%cd%
現在の作業中のディレクトリ
%date%
現在の日付。yyyy/MM/dd形式。書式を変えたいときは下記の変数の加工によって部分を切り貼りする。
%time%
現在の時刻。hh:mm:ss.SS形式。書式を変えたいときは下記の変数の加工によって部分を切り貼りする。
変数の加工
%ymd:~0,4%
substr相当。
変数ymd
の0文字目から4文字を切り出す例。ymd
に20201231
が入っていた場合は2020
が切り出される。
%ymd:~-4,2%
応用編。
マイナス値の場合は末尾から数える。ymd
が20201231
なら1231
の頭2文字、12
が切り出される。
%ymd:-4,-1%
応用編2.
第二引数がマイナス値の場合は末尾n
文字が捨てられる。ymd
が20201231
なら1231
の末尾1文字か捨てられ123
が切り出される。
%ymd:0=o%
置換。
例は”0″を”o”と置き換える意味。ymd
が20201231
なら、2o2o1231
になる。
特殊文字の記述
記述方法 | |
TABコード | テキストエディタの場合はそのままTABコードを記述すればよい。 |
ダブルクォート | “”。2回連続して記述。 |
% | コマンドプロンプトの場合はそのまま記述。 バッチファイル内で文字列として使用するときは2回連続して記述しないと変数を示す予約語として解釈されてしまう。 |
文字入力
set /p 変数名=メッセージ
使用例
@echo off
set user_age=
set /p user_age=年齢を入力してください...
echo あなたの年齢は %user_age% 才です.
実行結果
年齢を入力してください…22
あなたの年齢は 22 才です.
改行の出力
echo.
または echo;
または echo:
一時停止
pause
「続行するには何かキーを押してください . . .」
と表示して何か入力があるまで停止する。
timeout
「■ 秒待っています。続行するには何かキーを押してください …」と表示し、指定の秒数停止する。
例)timeout /t 5
5秒間経過 or 何かキーが押されたら続行する。
例2)timeout /t 3 /nobreak
「■ 秒待っています。終了するには CTRL+C を押してください …」と表示し、3秒間停止する。
非同期実行
通常は実行ファイル名だけ書くところを、start
コマンドを使うと非同期実行となる。
start notepad.exe
呼び出し方と終わり方
exit [結果コード]
呼出元の親バッチも道連れに終了する。
exit /B [結果コード]
/B
オプションを付けると呼出元に処理を戻しつつ、結果コードを返す。
呼出元で %ERRORLEVEL%
で 結果を評価できる。
cmd /C piyo.bat
/B
オプションなしで作られたバッチの結果コードを得たいときは、cmd /C
コマンドで呼び出す。
call piyo.bat cmd puyo.bat
普通に子バッチを呼び出すときは、call
や cmd
コマンドを使う。
ディレクトリの移動
pushd
ディレクトリの移動。
UNCパス(共有フォルダ)上でも移動ができる。
※cdコマンドでUNCパスへ移動できない。
popd
pushd
とセットで使う。pushd
で移動する前のディレクトリに戻る。一時的にディレクトリを移動するときに便利。
強制コピー
copy /y
メッセージも不要ならnulへリダイレクトする。
copy /y > nul
ステートメント
if (式) コマンド
条件判断を行う。(式)がtrue
のとき、コマンドを実行する。
コマンドが複数に渡る場合は、goto
文を使って実現する。
式の例(1) ファイルが存在するか
exist %1
if exist foo%1.txt goto skip
copy foo.txt foo%1.txt
:skip
式の例(2) 文字列比較
'%1'=='a'
式の例(3) 否定
not '%1'=='a'
goto (ラベル)
指定ラベルの書かれた行へジャンプする。
ラベルは、コロン(:)で始まる英字で指定する。
goto proc1
echo 実行されない
:proc1
exit
call (ラベル) (引数…)
指定ラベルの書かれた行へジャンプ
引数も一緒に渡すことができる。
call hello john
:hello
echo Hello, %1 !
exit /b
call (バッチファイル名)
バッチの呼出もできる。
コードページ
コマンドプロンプトはコードページMS932(≒ShiftJIS)がデフォルトですが、必要に応じてコードページを変更できる。
呼び出すプログラムの出力がUTF-8固定といった場合、そのままだと文字化けしてしまうが、事前に切り替えておくと文字化けを回避できる。
chcp
現在のコードページを表示する。
chcp 932
コードページをMS932にする。
chcp 65001
コードページをUTF-8にする。
コマンドプロンプト起動
コマンドプロンプトを起動した際に、作業に合わせてパス設定や任意のコマンドを実行して準備をしておきたい場合がある。その方法について。
(1) Windowsの検索から「コマンド プロンプト」を探し、ファイルの場所を開く。コマンドプロンプトのショートカットが存在するので、これを任意の場所にコピーする。
(2) コピーしたショートカットを右クリック>プロパティを開く。ショートカットの欄に、/k
オプションで実行したいバッチファイルを指定する。
/k
オプションなしでバッチファイルを指定するとバッチの終了と共にコマンドプロンプトも閉じてしまう。
Tips
ファイルの結合
copy
コマンドを使うとファイルを結合することができる。プラス記号で結合したいファイルを指定する。
copy file1.txt + file2.txt + file3.txt result.txt
ファイル名にスペースなどを含む場合は、コーテーション(””)で囲む。
ファイルを並べ替えて処理
for /F "delims=" %%x in ('dir /b %src_dir% ^| sort') do (
echo %%x
)
%src_dir%
の示すディレクトリ内のファイルをソートして、1ファイルずつ処理するループ。バッチの中なので、%%x
のように%
を二重に記述している。
/F "delims="
はin(…)
の中身を行単位で処理する意味になる。
パイプ記号はハット^
でエスケープしている。