■ 変数(Variable)
■ for
SYNTAX
FOR %%変数 IN (セット) DO command [param]
FOR /L %%変数 IN (開始,ステップ,終了) DO command [param]
:: RET: 1 2 3 4 5
FOR /L %%i IN (1,1,5) DO echo %%i
:: RET: 1 2 3 4 5
FOR /L %%i IN (5,-1,1) DO echo %%i
SYNTAX
FOR /F "eol=; tokens=2,3* delims=, " %%i in (file) do @echo %%i %%j %%k
DESC
file の各行を delims で区切り, 指定した tokens を変数にバインドして 処理をする
; foo.csv
aaa,bbb,ccc
111,222,333
:: RET:
:: aaa
:: 111
FOR /F "tokens=1 delims=," %%i in (foo.csv) DO echo %%i
:: 区切り文字 [,] [ ]
FOR /F "tokens=1 delims=, " %%i in (foo.csv) DO echo %%i
:: 2, 3 番目 Token を変数 i, j に Bind
FOR /F "tokens=2,3 delims=," %%i in (foo.csv) DO echo %%i %%j
:: Comment 文字 [;] より後ろは SKIP
FOR /F "eol=; tokens=1 delims=," %%i in (foo.csv) DO echo %%i
■ if
SYNTAX
// {} でなく ()
IF [NOT] ERRORLEVEL 番号 code
IF [NOT] 文字列1==文字列2 code
IF [NOT] EXIST ファイル名 code
IF defined 変数 ( code ) [else code ]
DESC
比較演算子
:: 文字列の比較 ( if でもいいはず )
IF var == 7 (
echo "same"
) ELSE (
echo "different"
)
:: Insentive ( 大文字, 小文字は無視 )
if /I Test == test (
echo 同じ
) else (
echo 違う
)
:: 文字列が数値のみなら 数値に変換されて大小比較
if 10 LSS 12 (
echo 10 は 12 より小さい
) else (
echo false
)
:: directory の有無をチェック
IF exist dir (
) ELSE (
)
:: file の有無をチェック
IF exist dir (
) ELSE (
)
:: 変数が定義されているかどうかチェック
IF defined v ( echo Def ) ELSE ( echo NotDef )
:: 環境変数があるかどうか
IF defined USERNAME ( echo Def %USERNAME% ) ELSE ( echo NotDef )
WARNING
:: 以下の記述だめかも
if aaa == aaa
(
echo "same"
)
:: 引数が空だと 問題あり ( bash 同様 )
:: AVOID
:: コマンドの構文が間違っています
if aaa == %5 (
echo same
)
:: GOOD
if aaa == "%5" (
echo same
)
ELSE 節は IF の後のコマンドと同じ行におく
AVOID
:: C のようにかけない
:: "ELSE" を命令として勘違いするらしい
IF EXIST filename. (
del filename.
)
ELSE (
echo filename. missing.
)
GOOD
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
:: 一行にするのも OK
IF EXIST filename. (del filename.) ELSE echo filename. missing
■ String
■ 長さ
DESC
関数などで調べる方法はないらしい
部分文字を抽出して調べる
set x=12345678
set y=%x:~8%
if defined y echo 9文字以上
set x=12345678
set y=%x:~8%
if defined y echo 9文字以上
set z=%x:~7%
if defined z echo 8文字以上
if defined z if not defined y echo 8文字
■ 抽出
SYNTAX
%var:~OFFSET,LENGTH%
:: 0 番目 から 2 つ
:: RET: ai
set var=aiueo
echo %var:~0,2%
:: 後ろから 4 つ目より後
:: RET: .txt
set var=foo.txt
echo %var:~-4%
:: 後ろから 4 つを消す
:: RET: foo
set var=foo.txt
echo %var:~0,-4%
:: 2 番目から後ろ
:: RET: ueo
set var=aiueo
echo %var:~2%
:: Argument の展開は失敗する
:: 別変数にセットしてからする
:: AVOID
set pathbody=%1:~0,-4%
:: GOOD
tmp=%1
set ret=%tmp:~0,-4%
:: 結合は 展開の結果をそのまま使う
set a=foo
set b=bar
echo %a%%b%
■ Math(算術演算)
SYNTAX
set /a exp
DESC
exp を 数式として評価する
:: 右辺を 数式として評価する
:: RET: 3
set /a var=1 + 2
echo %var%
:: RET: 1
set /a var=( 1 + 12 ) % 3
■ Drive.のきりかえ
:: [:] を忘れずに, 大文字 小文字はどちらでも OK
:: AVOID
d
:: GOOD
d:
:: GOOD
D:
■ Comment
REM comment
rem comment
:: comment