if errorlevel <數字> 待執行的命令
很多DOS程式在運行結束後會返回一個數字值用來表示程式啟動並執行結果(或者狀態),通過if
errorlevel命令可以判斷程式的傳回值,根據不同的傳回值來決定執行不同的命令(傳回值必須按照從大到小的順序排列)。如果傳回值等於指定的數
字,則條件成立,運行命令,否則運行下一句。
注意:
ERRORLEVEL 環境變數被設定為從選擇集選擇的鍵索引。列出的第一個選擇返回 1,第二個選擇返回
2,等等。如果使用者按的鍵不是有效選擇,該工具會發出警告響聲。如果該工具檢測到錯誤狀態,它會返回 255 的ERRORLEVEL 值。如果使用者按
Ctrl+Break 或 Ctrl+C 鍵,該工具會返回 0 的 ERRORLEVEL 值。在一個批程式中使用 ERRORLEVEL
參數時,將參數降序排列。
****************
Windowsコマンドプロンプトの文法一覧です。他の言語をある程度知っている人はこれを読めばコマンドプロンプトの基礎をマスターしてバッチファイルを書くことができるようになっています。簡易リファレンスとしても利用できます。
1. 基礎メッセージ表示
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]
2. 數値數値の表現
SET コマンドの /A オプションを用いることで変數に數値を代入することができます。なお、代入できるのは整數(32bit 値)のみで、小數は代入できません。
SET /A num=-2147483647 … OKSET /A num=0 … OKSET /A num=123 … OKSET /A num=2147483647 … OKSET /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 … 2SET /A num=1-1 … 0SET /A num=1*2 … 2SET /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
3. 文字列文字列の表現
文字列には引用符(ダブルクォーテーション等)を指定する必要はありません。また「=」の後の空白も文字列として処理されます。
SET str1=abcSET str2=de fSET str2= g hi
文字列操作
文字列を結合する方法です。
:: 結合SET str1=aaaSET str2=bbbSET str3=%str1%%str2% … aaabbb
配列に分割する機能はありません。
文字列の長さを求めるコマンドはありませんが、以下のようなバッチファイルで代用可能です。結果は ERRORLEVEL にセットされます。
@ECHO OFFREM File : GetLength.batREM Usage : GetLength.bat abcdeIF "%1"=="" GOTO :EOFSET /A LENGTH=0SET LAST=%1:LOOPSET /A LENGTH+=1SET LAST=%LAST:~1%IF NOT "%LAST%"=="" GOTO LOOPEXIT /B %LENGTH%
文字列から任意の位置の場所の文字を切り出す方法です。
:: 切り出しSET str1=abcdSET str2=%str1:~0,2% … ab(1桁目(オフセット0)から2文字)
4. 配列
配列はありません。
5. ハッシュ
ハッシュ変數はありません。
6. 制禦文IF コマンド
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 ENDSET /A 変數+=1GOTO LOOP:END
FOR コマンド
FOR /L ~ が、他の言語の FOR 文に相當します。
%変數には任意の単一文字(大文字、小文字は區別される)を指定可能ですが一般的には %i を用いることが多いようです。コマンドラインで実行する場合は「%変數」、バッチファイルで実行する場合は「%%変數」とします。
FOR /L %変數 IN (開始,増分,終了) DO コマンド [コマンドパラメータ]<例>FOR /L %i IN (1,1,3) DO @ECHO %i<実行結果>123
また、以下の構文により他の言語の FOR EACH ~(配列やコレクションを參照する機能)と同様の使い方も可能です。
FOR %変數 IN (セット) DO コマンド [コマンドパラメータ]<例>FOR %i IN (aaa bbb ccc) DO @ECHO %i<実行結果>aaabbbccc
7. サブルーチン
CALL コマンドでバッチファイルを呼び出すか、:ラベル名を指定します。引數は %1, %2, %3, ... としてセットされます。
サブルーチンの戻り値は EXIT /B [終了コード] を指定することで ERRORLEVEL として返卻可能です。
CALL :SUM 1, 2ECHO%ERRORLEVEL%GOTO END:SUMSET /A num1=%1SET /A num2=%2SET /A total=num1+num2EXIT /B %total%:END
8. ファイル入出力
FOR コマンドの /F オプションを利用することでファイルを解析し読み込むことが可能です。
以下のサンプルはファイルを1行ずつ読み込み出力ファイルに追記するサンプルです。コマンドラインで実行する場合は「%変數」、バッチファイルで実行する場合は「%%変數」とします。
FOR /F "tokens=*" %i IN (input.txt) DO ECHO %i>> output.txt
9. 知っておいたほうがよい文法
バッチファイルでよく出てくる知っておいたほうがよい文法の一覧です。
ECHO OFF
バッチファイル実行時は不要なメッセージを表示させないのが通例です(デバッグ時は除く)。
以下の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
10. 他の.batを呼ぶときは必ず
callを使う
バッチファイルから他のバッチファイルを呼ぶことはできますが、callを 使わない場合、信じられないことに、戻って來ません。
callで別フォルダのbatを呼び出した場合、カレントフォルダは通常は呼び出し元のまま です。通常はフォルダをまずpushdで変更した上でcallします。戻った後直ぐpopdで 戻します。popdではerrorlevelは変化しません。
@echo offpushd %~dp0pushd dir1\dir2\dir3call test1.bat nopausepopdif errorlevel 1 goto ERR:OKset result=0echo === OK ===goto END:ERRset result=1echo === SOME ERROR OCCURED ===:END@if not "%1"=="" goto NOPAUSEpause:NOPAUSEpopdexit /b %result%
なお、errorlevelのチェックには==などは使いません。if errolevel 1で正解です。
11. 改行(長いコマンド行を分ける)
長いコマンド行を分けるには分ける部分に^を置きます。
java -jar ..\..\lib\symphonie.jar syntax-check ^ -syntax syntax.hn -source e2.txt -xml -with_begin_end -out out2.xml