2008年5月9日金曜日
SET

せっかくなので、バッチファイルについて、もう少し。
正直、今更な話だけど、案外探すのが面倒なので、とりあえず自分用にここへ。

対話形式でなにかやろうとすると、コマンドプロンプト/MS-DOSって、どーしてもSETコマンドに頼らざるを得ない。
そんなときは

@ECHO OFF
SET /P TESTMSG=ここに何か入力してください。:
ECHO %TESTMSG%

として、バッチファイルを実行すると…
C:\>test.bat
ここになにか入力してください。:

で入力待ちになるので、なにか入力してエンターを押すと、入力された文字列がTESTMSGに格納される。
ECHOでそのTESTMSGを表示しておしまし。
C:\>test.bat
ここになにか入力してください。:テストメッセージ
テストメッセージ
C:\>


この場合、事前にTESTMSGになにかセットしておいても、入力で上書きされる。ただし何も入力をしないで、エンターを押すと、なにも格納されない。
なので、
@ECHO OFF
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I %ANSWER% EQU Y (
ECHO 了解いたしました。
)

とかやると、何も入力しない場合にはANSWERは空のまま。IF文でエラーになってしまう。
C:\>test.bat
よろしいですか?[Y/N]:
Yの使い方が誤っています
C:\>

対策するなら、「"」で括るか、
@ECHO OFF
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I "%ANSWER%" EQU "Y" (
ECHO 了解いたしました。
)

あらかじめ、なにか値を入れておくしかないのかな?(ここではデフォルトでNを入れてみた)
@ECHO OFF
SET ANSWER=N
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I %ANSWER% EQU Y (
ECHO 了解いたしました。
)


こうやってSET /Pだとその値を変更/更新することができるんだけど…

うーん…
こうして書いてみると、なにか忘れてることがある気がしてならん。

あぁ、そうそう、このSETコマンドはやはり環境変数の操作を行うものだから、バッチが終わっても有効なのだな。
なので、処理の最後で
SET 変数名=
で解放するか、処理の最初で初期化(解放と同じ)する必要があるね。

さっきの「よろしいですか?[Y/N]」のバッチだと、1回目にYと入力したあとすぐ2回目を実行し、空エンターで再度IF文に入るのだが、1回目に格納したYが未だ入ったままであるため、IF "入力" == "Y"が有効になってしまう。


…まぁ、とりあえずこんなカンジで書いていこうかと思ってる。
備忘録代わりってことでさ。



0 コメント | コメントを書く
Template Design: © 2007 Envy Inc.