现在的位置: 首页 > 综合 > 正文

Windows batch的基础语法

2012年12月26日 ⁄ 综合 ⁄ 共 4898字 ⁄ 字号 评论关闭

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  … 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/20 : 小数は切り捨て(商)
SET /A num=1/0     … NG : 0 除算エラーです。

 余りの求め方です。コマンドラインで実行する場合は「%」、バッチファイルで実行する場合は「%%」を指定します。

SET /A num=3%21(余り)
インクリメントとデクリメント

 インクリメントとデクリメントです

:: インクリメント
SET /A num+=1

:: デクリメント
SET /A num-=1

3. 文字列

文字列の表現

 文字列には引用符(ダブルクォーテーション等)を指定する必要はありません。また「=」の後の空白も文字列として処理されます。

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文字)

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 END

SET /A 変数+=1

GOTO LOOP

:END
FOR コマンド

 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

7. サブルーチン

 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

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 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で正解です。

11. 改行(長いコマンド行を分ける)

長いコマンド行を分けるには分ける部分に^を置きます。

  java -jar ..\..\lib\symphonie.jar syntax-check ^
       -syntax syntax.hn -source e2.txt -xml -with_begin_end -out out2.xml
【上篇】
【下篇】

抱歉!评论已关闭.