コマンド

2012/10/04

WindowsのバッチファイルのFOR内で 遅延環境変数の展開 をしつつ、FORの外でその値を参照する方法

タイトルがむっちゃ長くてしかも何を言っているのかさっぱりなんですが、Windowsのコマンドが解る人には解ると思います。たぶん。

最近、Windowsのバッチファイルを作る機会が多くあり、すっかり忘れていたコマンドの使い方を覚えなおしています。
ちなみに、ネットで調べるとき、「コマンド」で調べるとLinuxにヒットしてしまうので、コマンドプロンプト と付けると割りと探しているものが見つかります。

で、バッチファイルを作っている際に困った状態になりました。

settei.ini という 設定ファイルに
A
B
C

と書かれていて、この値を1個ずつ引数にして別のバッチを動かし、
その別のバッチで設定したメッセージを取得したい場合、

SUBBAT.bat に

~いろんな処理
SET SUBMESSAGE=メッセージ

と書かれていて、


MAINBAT.bat で

SET MESSAGE=
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=%MESSAGE%%SUBMESSAGE%
)

と SUBBAT.bat にある %SUBMESSAGE% を MAINBAT.bat のループ内の %MESSAGE% に追記しようとしても
うまくいきません。

というのも、 FOR のカッコ内は、FORが実行される時に変数が展開されてしまうから、
この時点で %MESSAGE% にも %SUBMESSAGE% にも値が無いので
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=
)
と同じことになってしまいます。

そんなわけで、SET MESSAGE= の時に変数を展開させるため、

SET MESSAGE=
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=%MESSAGE%,%SUBMESSAGE%
)
ENDLOCAL
ECHO %MESSAGE%

とすると、途中まで想定通りに動きます。
しかし、ECHO %MESSAGE% では何も表示されません。

というのも、ENDLOCAL を通り過ぎると %MESSAGE% が SETLOCAL を通る前の値に戻るので、
設定した値を参照できないからです。


どうすればいいのだ?と思って調べたら、
IIJIMASの日記って所に
バッチファイルで、setlocal~endlocal内での変数の値を外部に引き継ぎたい!
というズバリな記事がありました。

ENDLOCAL && SET MESSAGE=%MESSAGE%

とすれば、ENDLOCAL を通り過ぎても %MESSAGE% の値を参照できました。


できたのはいいが、
なんで Windows のバッチファイルは毎度毎度、こんなに裏技っぽいんだろう???

| | コメント (0) | トラックバック (0)

2005/05/18

よく使うのによく忘れるLinuxコマンド

個人的にしょっちゅう使っているのもかかわらず、いつも使い方を忘れてしまうLinuxのコマンドです。
思い出したら追加します。


コマンドからプロセスを表示する
ps -C コマンド名


RPMパッケージ情報の表示
$ rpm -qa | grep パッケージ名
q・・・queryオプション パッケージの問い合わせ
a・・・全てのインストール済みパッケージの問い合わせをする。


スクリプトファイルの実行
source ファイル名
. ファイル名 と同じ


tar.gz アーカーブファイルの解凍
tar -xzvf ファイル名

ディレクトリから tar.gz アーカーブファイルの作成
tar -czvf ファイル名 ディレクトリ

x・・・アーカイブからファイルを取り出す
c・・・新規にアーカイブを作成する
z・・・gzipで圧縮、解凍を行う
v・・・処理したファイルを一覧表示する
f・・・アーカイブのファイル名を指定する

| | コメント (0) | トラックバック (0)

2005/02/09

コマンドのリファレンス

Linuxほどではないにしても、Windowsでもコマンドはけっこう使います。
コマンドプロンプトからpingしたりってのは、日常茶飯事です。
でも、その時困るのが、どうやって使うのか?ということです。
/? オプションを付ければそれなりに説明は出ますが、Linuxのmanで調べられるほどの詳細な情報は出てきません。
でも、Windowsにはヘルプがあるので、Windowsのヘルプで調べれば詳細な情報が出てきます。
が、出てくるまでがけっこう大変だったりします。(汗)
パっと調べられんのかい!ってんで見つけた方法がこれです。

日経BP Windows2000ソリューション 1.Windows 2000のコマンドリファレンスへダイレクトにアクセスできるようにする

こうやってショートカットを作っておけば、調べたい時にパっと調べられます。

同じような方法でWindowsXPでも使えないかな?と思ったのですが、
うまくいきませんでした。
が、C:\WINDOWS\Help\ntcmds.chm (システムドライブがCドライブの場合)のショートカットを作成すれば、
同じように楽に調べられます。

DOSのコマンドは、
MYCOM PCWEB の MS-DOS辞書がお手軽です。

| | コメント (0) | トラックバック (0)