コマンドプロンプト バッチファイルの色々

よく使うものを。

バッチファイルのある場所へカレントフォルダへ移動する。

ショートカットからの起動で作業フォルダが変化している時など、これを先頭に入れておくと楽。

%~d0
cd %~dp0

%0が実行中のバッチファイル名、%~d0がバッチファイルのドライブ*1と「:」、%~p0がパス名(\以降。pathのp)に展開される。

詳しく知りたいときはhelp for内に一覧があります。

別記事:任意のフォルダでコマンドプロンプトを起動する方法 - 永遠に未実装

日付や時間表示

ストップウォッチやログ記録に。

>echo %DATE% %TIME%
2021/05/03  12:46:50.75

文字列操作(おすすめしない)

%変数名:置換前文字列=置換後文字列%で可能。

可読性が落ちる=自分の首を絞めることになるので非推奨。普通にプログラムを書いたほうが楽できる。機能では正規表現以下。

ログファイルを日単位で名前変更したいとき、くらいしか実用的な使い道は無い。

>set temp=aaa
>echo %temp:a=b%
bbb

>echo %TIME::=-%
12-46-50.75

>echo filename_%DATE:/=%.txt
filename_20210503.txt

一時的にPATHを変更してプロンプトを開く

環境変数を追加するのが不安な人に。

PATHの変更はこのウィンドウ内だけで有効。 バッチファイルの場合には最後にcmdを書いてウィンドウを開いたままにする。exitやウィンドウを閉じれば終了。

> set PATH=%PATH%;C:\Program Files\AdoptOpenJDK\jdk-13.0.1.9-hotspot\bin;
@rem バッチファイルの場合
set PATH=%PATH%;C:\Program Files\AdoptOpenJDK\jdk-13.0.1.9-hotspot\bin;
cmd

標準エラー出力のリダイレクト

1が標準出力で、2標準エラー出力

標準エラー出力を、標準出力へリダイレクトしたいときは、&をつけて2>>&1とする。

どうしてこういう仕様なのかはよくわからない。

> someapp.exe >>log.txt 2>>error.txt
> someapp.exe >>log.txt 2>>&1

最後に

上記は記号や数字を使った記述が多く、自然と難読化します。一方で使用頻度の観点からすると忘れやすく、労力かけて暗記するメリットも少ないです(仕事で毎日使うような場合を除く)。すでに書けるプログラミング言語があるなら、バッチファイルの編集は避け、使える言語で処理を書いたほうがこの先有利になるかもしれません。機能追加の面でも新しい言語のほうが有利なのと、2種類を使い分けるより、得意な1種類の言語に集中したほうが、勉強の効率が良いと考えているからです。

個人的意見ですが、ご参考にお願いします。

*1:driveのd