最後に、スクリプトにおける変数の扱いについて簡単に解説しておく。コマンドライン・スクリプトでは、変数を扱うことができる。これには、
の2つがある。ただし、どちらも変数といっても文字列しか記憶できず、また、コマンドライン・スクリプトでは、それらを使った計算式なども記述できないため、プログラム中では、なんらかの状態や文字列情報を記憶するだけの使い方となる。
環境変数は、本来、コマンドプロンプトで動作するコマンド類の動作を指定するためなどに使われる変数で、例えば、dirコマンドであれば、dircmdという環境変数を使って、dirコマンドのオプションをあらかじめ指定しておくことができる。
この環境変数は、setコマンドで値の設定を行う。具体的には、
set 変数名=設定値
とする。例えば、環境変数ENVPに“Windows2000”という文字列を設定したければ、コマンドプロンプトで次のようにする。
set ENVP=Windows2000
現在の環境変数の値を確認するには、引数を付けずに、単に「SET」というコマンドを実行すればよい。
C:\>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\testuser\Application Data
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=SERVER01
ComSpec=C:\WINNT\system32\cmd.exe
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\testuser
LOGONSERVER=\\SERVER01
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Os2LibPath=C:\WINNT\system32\os2\dll;
Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\system32\WBEM
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 5 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0501
(以下省略)
環境変数を参照するには、“%変数名%”という形を使い、コマンドの引数として指定すれば、その部分が実行直前に変数の内容に置き換わる。
set A=C:\WINNT
dir %A%
この例では、“dir C:\WINNT”が実行されることになる。
環境変数の初期値は、[コントロールパネル]−[システム]−[詳細]タブの[環境変数]などで設定されている。この場合、[〜のユーザー環境変数]に値をセットすると、そのユーザー固有の変数となるし、[システム環境変数]にセットすると、全ユーザーで共通の変数の設定となる。ここでセットしておいた値は、コマンドプロンプト起動時のデフォルトの環境変数の値となるが([システム環境変数]と同じ変数を[〜のユーザー環境変数]にもセットすると、後者が優先される)、後から上書きして、新しい値をセットすることももちろん可能である。
この変数と似たものに置き換え可能パラメータがある。これは、スクリプト・ファイルを実行するときにコマンドラインで指定された引数そのものを表す変数である。いま、ptest01.cmdというスクリプト・ファイルがあったとき、これを
ptest01 P01 P02 P03 P04 ... P10 P11 ...
として起動すると、このptest01.CMDの中に記述されているスクリプト中では、%1〜%9という特殊な変数が利用でき、この場合、
%1 ― P01
%2 ― P02
:
:
%9 ― P09
というふうに、その引数を取り扱うことができる。もし、9個以上の引数を扱いたければ、shiftコマンドを実行する。このコマンドを実行すると、引数が1つずつずれ、
%1 ― P02
%2 ― P03
:
:
%9 ― P10
というふうになる。必要な回数だけshiftコマンドを実行することで、引数と置き換え可能パラメータの対応をずらすことができる。通常は、ループの中で1回だけshiftコマンドを使い、先頭から順番にスクリプトのパラメータを取り出して、それを処理する、というふうに使用する。
変数の参照は、ifコマンドで使うことができる。このときいくつか注意点がある。例えば、
if /A == /%EV% ( echo EV=A ) else echo EV != A
とすると、環境変数EVの値が“A”のときには、“echo EV=A”が実行され、そうでないとき(未定義の場合も含む)は、else以降のコマンドが実行される。ここで、条件部分の左右の辺の先頭に“/”が含まれているが、これは、EVが未定義のときの対策である。このスラッシュ記号を付けずに、
if A == %EV% ( echo EV=A ) else echo EV != A
とすると、もしEVが未定義ならば、このコマンドは評価後、次のような形になる。
if A == ( echo EV=A ) else echo EV != A
“==”の左辺が“A”で、右辺が「空(から)」になっていることに注意されたい。これは、式としては正しくない形式なので、正しく動作できない(コマンド実行中にエラーが発生してしまう)。ところが、最初の例のように、両辺の先頭に“/”があると、評価後には
if /A == / ( echo EV=A ) else echo EV != A
となるため、比較が正しく行われ、else以降が実行されるわけである。
なお、今回はスラッシュを使ったが、実際には、ほかの文字でもかまわない。“#”を使う人もいるし、“==”の両辺の式をダブルクオート(“ ”)で囲むスタイルを使う人もいる(C言語などの文字列のスタイルにならっている)。要は自分でスタイルを決めたら、それを使い続けるようにしておけば、混乱が少なくなる、ということである。いくつもの表記方法を使ってしまうと、自分の書いたプログラムが把握しにくくなる。
なお、Windows 2000では、
if define 環境変数名
という形式で環境変数が定義されているかどうかを判定できるが、こうすると、上のような例を複数のifステートメントとしなければならないため、表記が煩雑となる。この機能は、環境変数の定義、未定義をフラグ的に扱うためのものだと考えたほうがいいだろう。
また、置き換えパラメータに関してのみ、オプションを使って、値として格納されているファイル/ディレクトリを表すパス名から情報を取り出すことができる。
例えば、
ファイル:paramtest01.bat
@echo off
echo PARAMETER: %1
echo EXT: %~x1
echo Name: %~n1
echo Drive: %~d1
echo Date: %~t1
いうスクリプトをparamtest01.batとして、引数にファイル・パス名を指定して実行すると、
C:\TMP>paramtest01 c:\tmp\testdir\file01.txt
PARAMETER: c:\tmp\testdir\file01.txt
EXT: .txt
Name: file01
Drive: c:
Date: 00/12/01 16:20
と展開される。つまり、パスを構成する各要素(ドライブ名、最後のファイル名、拡張子、日付など)に分解することができるのである。詳細については、Windows 2000ヘルプの「%(置き換え可能パラメータ)」を参照してもらいたい。
ここまでで、とりあえず、スクリプトの基礎は終了である。初めてプログラミングに触れる方にとっては、ちょっと難しい部分もあったかもしれないが、最初から複雑なスクリプトを作る必要はなく、単にコマンドを並べておくだけでも、いろいろと便利なことができるものである。最初は、簡単な条件判断を入れ、次にforコマンドなどを使った繰り返し処理などを実際に使ってみるといいだろう。
また、作成したスクリプトを置いておく場所として適当なディレクトリを作り、そこに対してパスを設定(“Path”環境変数で設定)しておくと便利だし、そのディレクトリを定期的なバックアップの対象にしておけば、作成したスクリプトの散逸を防ぐことができるだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.