if errorlevel <数字> 待执行的命令
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数 字,则条件成立,运行命令,否则运行下一句。
注意:
ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降序排列。
****************
Windowsコマンドプロンプトの文法一覧です。他の言語をある程度知っている人はこれを読めばコマンドプロンプトの基礎をマスターしてバッチファイルを書くことができるようになっています。簡易リファレンスとしても利用できます。
ECHO Hello, world.
コメントには「REM」(Remarks の略)を用いることが多いですが、「::」(本来はラベル)でもコメントの代用が可能です。ただし IF や FOR のブロック内では「::」はエラーになるので注意してください。
REM コメントその1 :: コメントその2
SET コマンドで変数(環境変数)の設定を行います。変数名と「=」の間は空白を入れず詰めて入力するようにしましょう(空白を含んだ変数名が設定されてしまう為)
SET 変数名=[文字列] SET /A 変数名=[数式]
変数を参照する場合は、%変数名% と「%」で囲む必要があります。
ECHO %変数名%
バッチファイルを実行するにはコマンドラインで次のようにします。
script.bat [Enter]
または
script.cmd [Enter]
.bat(Windows バッチファイル)と .cmd(Windows コマンド スクリプト)の大きな違いはありません。
スクリプトに同じ名前を付けた場合は .BAT が優先されます。優先順位は SET PATHEXT にて確認できます。
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
出力結果をファイルに書き出すにはリダイレクトを使います。「>」は上書きで「>>」は追記になります。
script.bat > file.txt [Enter]
SET コマンドの /A オプションを用いることで変数に数値を代入することができます。なお、代入できるのは整数(32bit 値)のみで、小数は代入できません。
SET /A num=-2147483647 … OK SET /A num=0 … OK SET /A num=123 … OK SET /A num=2147483647 … OK SET /A num=2147483648 … NG :「無効な数字です。数値は 32 ビットで表記される数値です。」 SET /A num=1.23 … NG :「演算子がありません。」
数値は、16進数、8進数表記での設定も可能です。
SET /A num=0x12 … OK : 16進数(値は28) SET /A num=022 … OK : 8進数(値は28) SET /A num=09 … NG :「無効な数字です。数値定数は 10 進 (17 桁)、16 進 (0x11 桁)、または 8 進 (021 桁) です。」
四則演算です。
SET /A num=1+1 … 2 SET /A num=1-1 … 0 SET /A num=1*2 … 2 SET /A num=1/2 … 0 : 小数は切り捨て(商) SET /A num=1/0 … NG : 0 除算エラーです。
余りの求め方です。コマンドラインで実行する場合は「%」、バッチファイルで実行する場合は「%%」を指定します。
SET /A num=3%2 … 1(余り)
インクリメントとデクリメントです
:: インクリメント SET /A num+=1 :: デクリメント SET /A num-=1
文字列には引用符(ダブルクォーテーション等)を指定する必要はありません。また「=」の後の空白も文字列として処理されます。
SET str1=abc SET str2=de f SET str2= g hi
文字列を結合する方法です。
:: 結合 SET str1=aaa SET str2=bbb SET str3=%str1%%str2% … aaabbb
配列に分割する機能はありません。
文字列の長さを求めるコマンドはありませんが、以下のようなバッチファイルで代用可能です。結果は ERRORLEVEL にセットされます。
@ECHO OFF REM File : GetLength.bat REM Usage : GetLength.bat abcde IF "%1"=="" GOTO :EOF SET /A LENGTH=0 SET LAST=%1 :LOOP SET /A LENGTH+=1 SET LAST=%LAST:~1% IF NOT "%LAST%"=="" GOTO LOOP EXIT /B %LENGTH%
文字列から任意の位置の場所の文字を切り出す方法です。
:: 切り出し SET str1=abcd SET str2=%str1:~0,2% … ab(1桁目(オフセット0)から2文字)
配列はありません。
ハッシュ変数はありません。
IF 文に相当します。1行に書く形式とブロック形式の構文が利用できます。
IF 条件 処理
ブロック形式の IF 文には () を用います。
IF 条件 ( 処理 ) ELSE ( 処理 )
ただしブロック形式では以下のような書き方をするとエラーになるので注意してください。
<エラーになる例> IF 条件 ( 処理 ) ELSE ( 処理 )
条件の箇所には、以下のような条件を指定することができます。
IF [NOT] ERRORLEVEL 番号 コマンド IF [NOT] 文字列1==文字列2 コマンド IF [NOT] EXIST ファイル名 コマンド IF 文字列1 比較演算子 文字列2 コマンド
比較演算子は次のいずれかになります。
EQU - 等しい NEQ - 等しくない LSS - より小さい LEQ - 以下 GTR - より大きい GEQ - 以上
WHILE 文はありませんが、GOTO コマンドと条件式を組み合わせることで代用可能です。
SET /A 変数=0 :LOOP 処理 IF "%変数%"=="終了値" GOTO END SET /A 変数+=1 GOTO LOOP :END
FOR /L ~ が、他の言語の FOR 文に相当します。
%変数には任意の単一文字(大文字、小文字は区別される)を指定可能ですが一般的には %i を用いることが多いようです。コマンドラインで実行する場合は「%変数」、バッチファイルで実行する場合は「%%変数」とします。
FOR /L %変数 IN (開始,増分,終了) DO コマンド [コマンドパラメータ] <例> FOR /L %i IN (1,1,3) DO @ECHO %i <実行結果> 1 2 3
また、以下の構文により他の言語の FOR EACH ~(配列やコレクションを参照する機能)と同様の使い方も可能です。
FOR %変数 IN (セット) DO コマンド [コマンドパラメータ] <例> FOR %i IN (aaa bbb ccc) DO @ECHO %i <実行結果> aaa bbb ccc
CALL コマンドでバッチファイルを呼び出すか、:ラベル名を指定します。引数は %1, %2, %3, ... としてセットされます。
サブルーチンの戻り値は EXIT /B [終了コード] を指定することで ERRORLEVEL として返却可能です。
CALL :SUM 1, 2 ECHO%ERRORLEVEL% GOTO END :SUM SET /A num1=%1 SET /A num2=%2 SET /A total=num1+num2 EXIT /B %total% :END
FOR コマンドの /F オプションを利用することでファイルを解析し読み込むことが可能です。
以下のサンプルはファイルを1行ずつ読み込み出力ファイルに追記するサンプルです。コマンドラインで実行する場合は「%変数」、バッチファイルで実行する場合は「%%変数」とします。
FOR /F "tokens=*" %i IN (input.txt) DO ECHO %i>> output.txt
バッチファイルでよく出てくる知っておいたほうがよい文法の一覧です。
バッチファイル実行時は不要なメッセージを表示させないのが通例です(デバッグ時は除く)。
以下の1行をバッチファイルの先頭に入れると以降のコマンドが画面上に表示されなくなります。
コマンドの前に @ を付けることによって、そのコマンド自身もコマンドプロンプトに表示されなくなります。
@ECHO OFF
%~ 構文は %変数 を様々な情報に展開します。以下は %0 を %~ 構文に従って展開した例です。
ECHO %~0 … ファイル名 :[test] ECHO%~f0 … フルパス :[C:\home\edu\BAT\expand\test.bat] ECHO%~d0 … ドライブ名 :[C:] ECHO%~p0 … パス名のみ :[\home\edu\BAT\expand\] ECHO%~n0 … ファイル名 :[test](拡張子無し) ECHO%~x0 … 拡張子 :[.bat] ECHO%~s0 … 短い名前のみ :[C:\home\edu\BAT\expand\test.bat] ECHO%~a0 … ファイル属性 :[--a------] ECHO%~t0 … ファイル日付 :[2010/02/05 00:45] ECHO%~z0 … ファイルサイズ:[204] ECHO%~dp0 … ファイルの場所:[C:\home\edu\BAT\expand\] ECHO%~nx0 … ファイル名 :[test.bat](拡張子付き) ECHO%~fs0 … 完全なパスと短い名前:[C:\home\edu\BAT\expand\test.bat] ECHO%~ftza0 … 複合表示 :[--a------ 2010/02/05 00:45 204 C:\home\edu\BAT\expand\test.bat]
例えば、バッチファイルのある場所に移動するには、以下のコマンドを実行します。
cd /d %~dp0
バッチファイルから他のバッチファイルを呼ぶことはできますが、callを 使わない場合、信じられないことに、戻って来ません。
callで別フォルダのbatを呼び出した場合、カレントフォルダは通常は呼び出し元のまま です。通常はフォルダをまずpushdで変更した上でcallします。戻った後直ぐpopdで 戻します。popdではerrorlevelは変化しません。
@echo off pushd %~dp0 pushd dir1\dir2\dir3 call test1.bat nopause popd if errorlevel 1 goto ERR :OK set result=0 echo === OK === goto END :ERR set result=1 echo === SOME ERROR OCCURED === :END @if not "%1"=="" goto NOPAUSE pause :NOPAUSE popd exit /b %result%
なお、errorlevelのチェックには==などは使いません。if errolevel 1で正解です。
長いコマンド行を分けるには分ける部分に^を置きます。
java -jar ..\..\lib\symphonie.jar syntax-check ^ -syntax syntax.hn -source e2.txt -xml -with_begin_end -out out2.xml