Windowsバッチのチートシート

  技術情報

変数

%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文字を切り出す例。ymd20201231が入っていた場合は2020が切り出される。

%ymd:~-4,2%

応用編。
マイナス値の場合は末尾から数える。ymd20201231なら1231の頭2文字、12が切り出される。

%ymd:-4,-1%

応用編2.
第二引数がマイナス値の場合は末尾n文字が捨てられる。ymd20201231なら1231の末尾1文字か捨てられ123が切り出される。

%ymd:0=o%

置換。
例は”0″を”o”と置き換える意味。ymd20201231なら、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(…)の中身を行単位で処理する意味になる。

パイプ記号はハット^でエスケープしている。

LEAVE A COMMENT