目次
バッチファイル引数修飾
Windows2000以降、結構コマンドプロンプトに手が入っていて、昔悩まされたような事が簡単に解決できるようになっているみたいです。 WSH駆使してがんばった部分が要らなくなったりするかもしれません。
以下は、WindowsXP/2003でのお話です。
CMD.EXE for Windows2003/XP
お客様のサーバOSがHP-UXからWindows2003に変更されるとの事。 cshやbshのスクリプトが混在しまくる環境下からWindowsの環境下へ移植するものが大量発生します。
一つ二つの変更なら問題ないですけど、何がいくつあってどう関係しているのやらもう何がなんだか…
バッチファイルの引数に修飾をかけられる
これいつからなんだろう?バッチ パラメータを使用する
hogehoge.bat arg1 arg2 …
バッチファイルの引数に指定された文字列は、バッチファイル内で “%n” (nは引数の出現順序) を使い参照できます。 この時、引数の内容を修飾して利用することが可能になりました。
C:\WORKFOLD\batch>dir ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は E00A-3979 です C:\WORKFOLD\batch のディレクトリ 2006/11/24 15:57 <DIR> . 2006/11/24 15:57 <DIR> .. 2006/11/24 16:02 338 aa.bat 1 個のファイル 338 バイト 2 個のディレクトリ 128,270,049,280 バイトの空き領域 C:\WORKFOLD\batch>
- aa.bat
aa.bat: @echo off rem ** 引数をファイルだとみなして修飾操作する ** echo -------------------------------------------- echo arg1=%1 echo arg1=%~1 echo arg1=%~f1 echo arg1=%~d1 echo arg1=%~p1 echo arg1=%~n1 echo arg1=%~x1 echo arg1=%~s1 echo arg1=%~a1 echo arg1=%~t1 echo arg1=%~z1 echo --------------------------------------------
この環境下でaa.batを色々実行してみると面白いことがわかります。
引数なし
C:\WORKFOLD\batch>aa.bat -------------------------------------------- arg1= arg1= arg1= arg1= arg1= arg1= arg1= arg1= arg1= arg1= arg1= -------------------------------------------- C:\WORKFOLD\batch>
引数は無いので、%1 自体使えませんね。
ファイルを指定
C:\WORKFOLD\batch>aa.bat aa.bat -------------------------------------------- arg1=aa.bat arg1=aa.bat arg1=C:\WORKFOLD\batch\aa.bat arg1=C: arg1=\WORKFOLD\batch\ arg1=aa arg1=.bat arg1=C:\WORKFOLD\batch\aa.bat arg1=--a------ arg1=2006/11/24 16:02 arg1=338 -------------------------------------------- C:\WORKFOLD\batch>
aa.bat を引数に指定してみました。 aa.bat 自身の情報が展開されています。 ファイルサイズと更新時刻(かな?)が取得できるのはうれしいかもしれません。
適当な文字列
C:\WORKFOLD\batch>aa.bat bb.bat -------------------------------------------- arg1=bb.bat arg1=bb.bat arg1=C:\WORKFOLD\batch\bb.bat arg1=C: arg1=\WORKFOLD\batch\ arg1=bb arg1=.bat arg1=C:\WORKFOLD\batch\bb.bat arg1= arg1= arg1= -------------------------------------------- C:\WORKFOLD\batch>
bb.bat なる、存在しないファイルを指定したつもりです。でもバッチファイル的には指定された文字列がファイルかどうかは関係ありません。 ファイルでなければ取得できないパラメタはカラですね。
ロングファイルネーム+正規表現
C:\WORKFOLD\batch>aa.bat "c:\Docu*\Administrator\*" -------------------------------------------- arg1="c:\Docu*\Administrator\*" arg1=c:\Docu*\Administrator\* arg1=c:\Documents and Settings\Administrator\* arg1=c: arg1=\Documents and Settings\Administrator\ arg1=* arg1= arg1=c:\DOCUME~1\ADMINI~1\* arg1= arg1= arg1= -------------------------------------------- C:\WORKFOLD\batch>
ファイル名が “*” になってますね。ファイル一覧になるのを期待してはいけないようです。 ショートファイルネームは場合によってはありがたいかもしれない。
ショートカット
C:\WORKFOLD\batch>aa.bat "C:\Documents and Settings\All Users\デスクトップ\Mozilla Firefox.lnk" -------------------------------------------- arg1="C:\Documents and Settings\All Users\デスクトップ\Mozilla Firefox.lnk" arg1=C:\Documents and Settings\All Users\デスクトップ\Mozilla Firefox.lnk arg1=C:\Documents and Settings\All Users\デスクトップ\Mozilla Firefox.lnk arg1=C: arg1=\Documents and Settings\All Users\デスクトップ\ arg1=Mozilla Firefox arg1=.lnk arg1=C:\DOCUME~1\ALLUSE~1\デスク~1\MOZILL~1.LNK arg1=--a------ arg1=2006/11/20 15:26 arg1=1602 -------------------------------------------- C:\WORKFOLD\batch>
ファイルはファイル、ということか。
その他注意点
適用する環境で必ずテストすること。 必ず動くかどうかは判らない。
将来的なことを考えると、あまり複雑な場合はWSHで書いたほうがいいと思う。