miau's blog?

Batch files

仕事でバッチファイル(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 のほうがいいのかもしれません。
posted at 11:44:26 on 2005-08-21 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。