Vista - note - cmd - script
|
extention
|
.cmd |
|
|
comment |
rem |
|
|
|
:: |
2 colons at the line head? |
|
echo off |
@echo off |
@ can supress echo off itself |
|
set env var |
SET MSSdk=C:\Program
Files\Microsoft SDKs\Windows\v6.0 |
space can be used as it is |
|
refere env var |
Set SdkTools=%MSSdk%\Bin |
pair of % |
|
empty env var |
SET TARGET_CPU= |
|
|
IF |
see here |
|
|
IF /I |
see here |
|
|
|
|
|
|
argv[5] |
IF NOT "x%~5"=="x" GOTO ERROR_Usage |
argv[0] = command |
|
argv parse |
see here |
SHIFT %~1 |
|
|
|
|
|
FOR |
see here |
|
|
|
|
|
|
SET |
|
|
IF
バッチ プログラム中で条件処理を実行します。
IF [NOT] ERRORLEVEL 番号 コマンド
IF [NOT] 文字列1==文字列2 コマンド
IF [NOT] EXIST ファイル名 コマンド
NOT 条件が偽の場合にだけ、Windows がコマンドを実行する
ことを指定します。
ERRORLEVEL 番号 最後のプログラムの実行で指定された番号以上の終了コード
が返されたときに、条件が真になるように指定します。
文字列1==文字列2 テキスト文字列が一致するときに条件が真になるように指定
します。
EXIST ファイル名 指定したファイル名が存在するときに条件が真になるように
指定します。
コマンド 条件が真のときに実行するコマンドを指定します。コマンドに
続けて、ELSE キーワードの後、指定した条件が偽の場合に
実行される ELSE コマンドを指定することができます。
ELSE 節は、IF の後のコマンドと同じ行に置きます。
例:
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
del コマンドは、改行で終了しなければならないため、次の例は、正しく動作し
ません:
IF EXIST filename. del filename. ELSE echo filename. missing
ELSE コマンドは、IF コマンドの終わりと同じ行で始まらなければならないため、
次の例は正しく動作しません:
IF EXIST filename. del filename.
ELSE echo filename. missing
次の例のように、すべてのコマンドを 1 行にすれば正しく動作します:
IF EXIST filename. (del filename.) ELSE echo filename. missing
コマンド拡張機能を有効にすると、IF は次のように変更されます:
IF [/I] 文字列 1 比較演算子 文字列 2 コマンド
IF CMDEXTVERSION 番号 コマンド
IF DEFINED 変数 コマンド
比較演算子は、次のいずれかです:
EQU - 等しい
NEQ - 等しくない
LSS - より小さい
LEQ - 以下
GTR - より大きい
GEQ - 以上
/I スイッチを指定すると、文字列は、大文字と小文字を区別せずに比較され
ます。
/I スイッチは、IF の文字列 1 == 文字列 2 形式で使うこともできます。
この比較は汎用であり、文字列 1 と文字列 2 が両方とも
数字だけを含む場合は、文字列が数値に変換され、
数値の比較が行われます。
CMDEXTVERSION 条件は ERRORLEVEL と同様に動作しますが、コマンド拡張機能
に関連付けられている内部バージョン番号との比較を行います。最初の
バージョンは 1 です。
コマンド拡張機能に重要な拡張が追加された場合は、値が
1 大きくなります。コマンド拡張機能が無効である場合は、CMDEXTVERSION
条件は常に偽です。
DEFINED 条件は EXISTS と同様に動作しますが、環境変数名を受け取って、環境
変数が定義されている場合は真を返します。
%ERRORLEVEL% は、ERRORLEVEL の現在の値の文字列表記に
展開されます。
ただし、ERRORLEVEL という名前の環境変数が既に定義されている場合は、その
環境変数の値が取得されます。
プログラム実行後、次の例が ERRORLEVEL の使い方
を説明しています:
goto answer%ERRORLEVEL%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1
また、上の数値比較を使うこともできます:
IF %ERRORLEVEL% LEQ 1 goto okay
%CMDCMDLINE% は、CMD.EXE が処理する前の、CMD.EXE に渡されたオリジナル
のコマンド ラインに展開されます。
ただし、CMDCMDLINE という名前の環境変数が既に定義されている場合は、
その環境変数の値が取得されます。
%CMDEXTVERSION% は、CMDEXTVERSION の現在の値の文字列表記に
展開されます。
ただし、CMDEXTVERSION という名前の環境変数が既に定義されている場合は、
その環境変数の値が取得されます。
IF /I "%PROCESSOR_ARCHITECTURE%"=="x86" (SET TARGET_CPU=x86)
ELSE IF /I "%PROCESSOR_ARCHITECTURE%"=="IA64" (SET TARGET_CPU=IA64)
ELSE IF /I "%PROCESSOR_ARCHITECTURE%"=="AMD64" (SET TARGET_CPU=x64)
ELSE IF /I "%PROCESSOR_ARCHITECTURE%"=="x64" (SET TARGET_CPU=x64)
ELSE IF /I "%PROCESSOR_ARCHITEW6432%"=="IA64" (SET TARGET_CPU=IA64)
ELSE IF /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" (SET TARGET_CPU=x64)
ELSE (SET TARGET_CPU=x86)
argv parse
IF NOT "x%~5"=="x" GOTO ERROR_Usage
:Parse_Args
IF /I "%~1"=="/Debug" SET TARGET_DEBUGTYPE=DEBUG& SHIFT & GOTO Parse_Args
IF /I "%~1"=="/Release" SET TARGET_DEBUGTYPE=RELEASE& SHIFT & GOTO Parse_Args
IF /I "%~1"=="/x86" SET TARGET_CPU=x86& SHIFT & GOTO Parse_Args
IF /I "%~1"=="/x64" SET TARGET_CPU=x64& SHIFT & GOTO Parse_Args
IF /I "%~1"=="/ia64" SET TARGET_CPU=IA64& SHIFT & GOTO Parse_Args
IF /I "%~1"=="/vista" SET TARGET_PLATFORM=LH& SHIFT & GOTO Parse_Args
IF /I "%~1"=="/xp" SET TARGET_PLATFORM=XP& SHIFT & GOTO Parse_Args
IF /I "%~1"=="/2003" SET TARGET_PLATFORM=SRV& SHIFT & GOTO Parse_Args
IF /I "%~1"=="-h" GOTO ERROR_Usage
IF /I "%~1"=="/?" GOTO ERROR_Usage
IF "%~1" EQU "" GOTO Done_Args
ECHO Unknown command-line switch: %~1
GOTO ERROR_Usage
:Done_Args
FOR
指定されたコマンドをファイル セットの各ファイルに対して実行します。
OR %変数 IN (セット) DO コマンド [コマンドパラメータ]
%変数 単一文字の置き換え可能なパラメータを指定します。
(セット) ファイル セットを指定します。ワイルドカードを使用できます。
コマンド 各ファイルごとに実行するコマンドを指定します。
コマンドパラメータ
指定されたコマンドのパラメータまたはスイッチを指定します。
バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、
%変数を使用してください。変数名では大文字と小文字が区別されるため、
i と %I は異なります。
コマンド拡張機能を有効にすると、次の FOR コマンドの追加形式
がサポートされるようになります:
OR /D %変数 IN (セット) DO コマンド [コマンド パラメータ]
セットがワイルドカードを含む場合は、ファイル名ではなくディレクトリ名
の一致を指定します。
OR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンド パラメータ]
[ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
ます。/R の後にディレクトリが指定されていない場合は、現在の
ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
ディレクトリ ツリーの列挙だけを行います。
OR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメータ]
セットは、ステップの量ごとに変化する開始から終了までの数列です。
たとえば、(1,1,5) は 1 2 3 4 5、(5,-1,1) は (5 4 3 2 1) という数列に
なります。
OR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
[コマンド パラメータ]
OR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメータ]
OR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメータ]
または usebackq オプションの場合:
OR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
[コマンド パラメータ]
OR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメータ]
OR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメータ]
ファイル名セットは、1 つ以上のファイル名です。各ファイルが開かれ、読み
取られ、処理されてから、ファイル名セットの次のファイルに進みます。処理
には、ファイルの読み取り、個々のテキスト行への分割と、0 個以上のトークン
への解析が含まれます。その後、変数値を見つかったトークン文字列に設定して、
for ループの本体が呼び出されます。既定では、/F は、各ファイルの各行から、
空白で区切られた最初のトークンを渡します。空白行はスキップされます。既定
の解析動作を変更するには、オプションの "オプション" パラメータを指定しま
す。これは、異なる解析オプションを指定する 1 つ以上のキーワードを含む、
引用符で囲まれた文字列です。キーワードは、次のとおりです:
eol=c - 行末のコメント文字を指定します (1 文字)。
skip=n - ファイルの先頭でスキップする行数を指定します。
delims=xxx - 区切り文字のセットを指定します。
これは、既定の区切り文字であるスペースとタブを
置き換えます。
tokens=x,y,m-n - 各繰り返しに対して、各行から for 本体に渡す
トークンを指定します。これにより、追加の変数名が割り当
てられます。
m-n の形式は範囲で、m 番目から n 番目の
トークンを指定します。
tokens= 文字列の最後の文字がアスタリスクである場合は、
追加の変数が割り当てられ、最後のトークンが解析された後
、
行に含まれている残りのテキストを受け取ります。
usebackq - 次の新しい表示形式を指定します。
逆引用符で囲まれた文字列がコマンドとして実行され、
一重引用符で囲まれた文字列がリテラル文字列コマンドにな
り、
ファイル名セットのファイル名を二重引用符で
囲めるようになります。
例を参考にしてください:
OR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
この例は、myfile.txt の各行を解析します。セミコロンで始まる行を無視し、
各行の 2 番目と 3 番目のトークンを for 本体に渡します。
トークンは、コンマまたはスペースで区切られています。
for 本体の文が %i で 2 番目のトークンを、%j で 3 番目のトークンを取得し、
%k で 3 番目以降のすべてのトークンを取得していることに
注意してください。
スペースを含むファイル名に対しては、二重引用符でファイル名を引用する
必要があります。
この方法で二重引用符を使うためには、usebackq オプションを
使わなければなりません。
使わなければ、二重引用符はリテラル文字列の定義として
解釈され、解析されます。
%i は for 文で明示的に宣言され、%j と %k は tokens= オプションで暗黙的に
宣言されています。
tokens= 行を使って 26 個までのトークンを指定できますが、
文字 'z' または 'Z' よりも高い変数を宣言することはできません。FOR 変数名は
単一の文字で、大文字と小文字を区別し、グローバルなものであり、一度にアクティ
ブ
にできるのは合計 52 個までです。
また、かっこで囲んだファイル名セットを一重引用符で囲み、文字列にすることに
より、即時の文字列に対する FOR /F 解析ロジックを使うこともできます。
これは、ファイルからの単一入力行として処理されます。
最後に、FOR /F コマンドを使って、コマンド出力を解析することができます。
かっこの中のファイル名セットを逆引用符で囲みます。この文字列は、コマンド
ラインとして子 CMD.EXE に渡されます。出力はメモリにキャプチャされ、
ファイルのように解析されます。
例:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
この例は、現在の環境の環境変数名を列挙します。
また、FOR 変数参照の置換も拡張されました。
次のオプション構文を使うことができます:
%~I - すべての引用句 (") を削除して、%I を展開します。
%~fI - %I を完全修飾パス名に展開します。
%~dI - %I をドライブ文字だけに展開します。
%~pI - %I をパス名だけに展開します。
%~nI - %I をファイル名だけに展開します。
%~xI - %I をファイル拡張子だけに展開します。
%~sI - 展開されたパスは短い名前だけを含みます。
%~aI - %I をファイルの属性に展開します。
%~tI - %I ファイルの日付/時刻に展開します。
%~zI - %I ファイルのサイズに展開します。
%~$PATH:I - PATH 環境変数に指定されているディレクトリを
検索し、最初に見つかった完全修飾名に %I を
展開します。
環境変数名が定義されていない場合、または検索
してもファイルが見つからなかった場合は、この
修飾子を指定すると空の文字列に展開されます。
修飾子を組み合わせて、複合結果を得ることもできます:
%~dpI - %I をドライブ文字とパスだけに展開します。
%~nxI - %I をファイル名と拡張子だけに展開します。
%~fsI - %I を完全なパスと短い名前だけに展開します。
%~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
検索して %I を探し、最初に見つかったファイル
のドライブ文字とパスだけに展開します。
%~ftzaI - %I を DIR コマンドの出力行のように展開します。
上の例の %I と PATH は、他の有効な値で置き換えることができます。
~ 構文は、有効な FOR 変数名によって区切られます。%I のような大
文字の変数を使うと読み取りやすく、大文字と小文字を区別しない修飾子
との混乱を避けることができます。
for /F "delims=" %I IN ( 'dir /S /B フォルダ名' ) DO echo
"%I" >> 出力先
SET
cmd.exe 環境変数を表示、設定、または削除
コマンド拡張機能有効時
等号や値を指定せずに、変数名だけを指定して SET コマンドを実行すると、
SET コマンドに指定された名前にプレフィックスが一致するすべての変数の値が
表示
ex)
SET P … 文字 'P' で始まるすべての変数が表示
変数名が現在の環境に見つからない場合 ERRORLEVEL 1 設定
SET コマンドでは、変数の名前に等符号を使用することはNG
SET のスイッチ:
SET /A 式
SET /P 変数=[プロンプト文字列]
/A スイッチは、等号の右側の文字列が、評価する数式であることを指定
式の評価は次の操作がサポートされ、操作優先順位の高い順に示す:
() - グループ化
! ~ - - 単項演算子
* / % - 算術演算子
+ - - 算術演算子
<< >> - 論理シフト
& - ビット演算子 AND
^ - ビット演算子排他的 OR
| - ビット演算子 OR
= *= /= %= += -= - 代入
&= ^= |= <<= >>=
, - 式の区切り記号
論理演算子またはモジュール演算子を使う場合は、式文字列を
引用符で囲む必要がある
式内の数値以外の文字列は環境変数文字列として処理
使用される前に数値に変換される
指定された環境変数名が現在の環境で定義されていない場合は、
値として 0 が使用
コマンド スクリプト外でコマンド ラインから SET /A を実行すると、
式の最終的な値を表示
割り当て演算子を使うには、割り当て演算子の左側に環境変数名が必要
数値は 10 進数
プレフィックスとして 0xを付けると 16 進数
0 を付けると 8 進数
/P はユーザーによって入力された入力行を変数の値として設定できるようにする
入力行を読み取る前に、指定されたプロンプト文字列を表示
プロンプト文字列は空でも可
環境変数の置換は、次のように拡張:
%PATH:文字列 1 = 文字列 2%
は、PATH 環境変数を展開し、その結果に含まれるすべての "文字列 1" を"文字列 2" に置き換え
"文字列 2" に空の文字列を指定すると、展開された出力からすべての "文字列 1"を削除
"文字列 1"をアスタリスクで始め、展開された出力の先頭から、文字列 1 の残りの部分が最初に現れるまでのすべてを一致させることもできる
展開の副文字列を指定(Substr)
%PATH:~10,5%
PATH 環境変数を展開し、展開結果の 11 番目 (オフセット 10) の文字から始まる 5 文字だけ
長さが指定されなかった場合は、変数の値の残りの長さを既定値
オフセットまたは長さのどちらかが負の値の場合、環境変数の値の長さに指定されたオフセットまたは長さをたしてその数を使う
%PATH:~-10%
パス変数の最後の 10 文字が展開
%PATH:~0,-2%
最後の 2 文字以外のすべてが展開
遅延環境変数の展開
既定で無効
CMD.EXE の /V: のコマンド ライン スイッチを使って有効または無効
遅延環境変数の展開は、実行時ではなく、テキスト行を読み取るときに展開されるという現在の制限を避ける
-> 無効では変数の評価を一度にバッチ全体に影響を与えるのを、有効では一行ずつの評価に変える
遅延環境変数の展開では、実行時に環境変数を展開するために異なった文字
(感嘆符) を使う
遅延環境変数の展開が有効な場合動作
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
コマンド拡張機能が有効な場合、SET によって表示される変数の一覧には
現れないいくつかの動的な環境変数があり、変数の値が展開されるときに
動的に計算される
ユーザーがこれらの名前の変数を明示的に定義する場合、
その定義は下記の動的な定義を無効にする
%CD% - 現在のディレクトリ文字列に展開
%DATE% - DATE コマンドと同じフォーマットで現在の日付に展開
%TIME% - TIME コマンドと同じフォーマットで現在の時刻に展開
%RANDOM% - 0 から 32767 の間の任意の 10 進数に展開
%ERRORLEVEL% - 現在の ERRORLEVEL の値に展開
%CMDEXTVERSION% - 現在のコマンド プロセッサ拡張機能のバージョン番号に展開
%CMDCMDLINE% - コマンド プロセッサを起動したオリジナル コマンド ラインに展開