2013年8月17日土曜日

Windowsコマンドプロンプト基礎文法最速マスター

http://windows.g.hatena.ne.jp/cx20/20100203/p1

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 が優先されます。優先順位は SETPATHEXT にて確認できます。
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

参考情報

その他の基礎文法マスター

この記事は他の基本文法マスターに便乗して書いた物です。誤り等ございましたらコメント等して頂けると助かります。

0 件のコメント: