仕事でバッチファイル(DOS バッチ)いじる必要があったんですが、いくつかハマってたのでそのあたりの話でも。
■IF
これがなんだか思い通りに動作してくれなくて。
コーディングミスかなー?と思って色々調べてたんですが、以下のようなプログラムがあった場合、
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
echo %VAR% …(1)
)
echo %VAR% …(2)
(1) では「before」と出力され、(2) では「after」と出力されるところまで突き止めました。
なぜ?と思いつつググってみると。
setコマンドの遅延展開について
なるほど。IF 内部の環境変数は一括で解決されると。
今回は (1) の部分で外部プログラム呼んでたんですが、特に必要もなかったので (2) の位置に移動させて事なきを得ました。
ちなみにこのへんの説明は set /? で読めたらしい。
以前作った hhh.bat に頼ってばかりいたけど、普通のヘルプも読む癖つけないと。
■SET
ファイル(hoge.dat)の内容を環境変数(HOGE)に設定する場合。
6、テキストデータをバッチに送る - 極テクニック紹介 みたいな感じで、
(1)
set HOGE=
という内容のファイル(set_hoge.tpl) を準備
(2)
copy /b set_hoge.tpl+hoge.dat set_hoge.bat
として設定用バッチ作成
(3) set_hoge.bat 実行
なんてことをやらないといけないのかなー?と思ってたんですが・・・
set /P HOGE=<hoge.bat
でいけるみたいですね。全然知らなかった。
■コーディングルール
どういう風に書くのが標準的なのかわからなくて、いちいち迷ったり。
・コマンドは大文字/小文字どちらで書くべきか
・コメントは REM で書くべきか、:: で書くべきか、それとも %〜% で書くべきか
・SETLOCAL は使ったほうがいいか
とか。
今回書いてて思ったことは、
・コマンドは UNIX 風に小文字のほうが読みやすいかも。
環境変数とやラベル区別つきやすいし。
・コメントは :: がいいかも。
REM は他のコマンドと識別しづらいし、:: のほうがパフォーマンス的に優れているという意見も見かけたし。
とりあえずサクラエディタで :: もコメントとして表示されるよう設定。
・環境設定以外の部分では SETLOCAL 使ったほう読みやすい気がする。
みたいな感じです。
なんか標準ルールとかご存知な方は教えてください。
■その他
面白そうなリンクとか。
Rob van der Woude's Scripting Pages: Batch Files, Rexx, KiXtart, Perl, VBScript
一風変わったコマンドの使い方が紹介されてたり。
それはそれ。これはこれ。
バッチについて色々実験されてる様子。
ちなみにバッチファイル使って bcp 動かすのが今回の目的。
このへんでもなにやら大変だったんですが、これはまた別項で。
(2008-04-15 追記)
SETLOCAL を使ったほうがいいって書いたけど、ENABLEDELAYEDEXPANSION をつけるとさらにいいかも。
CMD.EXEの遅延環境変数の展開 - KOBUN
上に書いたように IF でハマることなくなりそうだし。
(2009-03-02 追記)
その後コメントはずっと :: で書くようにしてたけど、FOR 内では :: がうまく機能しないようで。汎用性という点では REM のほうがいいのかもしれません。