■ 変数(Variable)
:: 代入
set VAR=aaa
:: 展開
echo %VAR%
WARNING
:: [=] の前の space だめ
set var =abc
:: [=] の後の space は OK ( ただし space も文字あつかい " abc" がセット )
set var= abc
:: bash と同じく space を入れないのが無難
set var=abc
:: 遅延展開を有効にする
setlocal ENABLEDELAYEDEXPANSION
set a=foo
if %a% == foo (
set a=bar
:: RET
:: foo
echo %a%
:: 遅延( 実行時 )展開
:: RET
:: bar
echo !a!
)
■ 組込み変数(EmbededVariable)
:: WORKING PATH
:: CurrentDirectory のチェックに便利
echo %CD%
:: C:\WINDOWS
echo %SystemRoot%
:: C:
echo %SystemDrive%
:: \Documents and Settings\usrname
echo %HomePath%
:: \Documents and Settings\usr
echo %HOMEPATH%
:: あなたがつけたコンピュータ名
echo %HOSTNAME%
■ Command.の結合
SYNTAX
cmdA && cmdB
cmdA || cmdB
:: コマンドの実行結果が真であれば, echo bbb を実行
echo aaa && echo bbb
cmd /c copy aa.txt bb.txt >nul && echo succeeded.
cmd /c copy aa.txt bb.txt >nul || echo fail
cmd /c echo aaa && echo succeeded.
■ Redirect
■ STDOUT
DESC
cmd にも pipe という概念があるらしい
REF
Windows NTのコンソール
::
:: Redirect
::
echo aaa > d:/ret.txt
:: stderr のみ
echo aaa 2> d:/ret.txt
:: stdout のみ
echo aaa 2> d:/ret.txt
:: stdout stdin を同じにする
echo aaa > d:/ret.txt 2>&1
■ 引数をとる(Argument)
cnt.bat 1 2 3
:: RET 1
echo $1
:: RET 2
echo $2
:: RET 3
echo $3
:: 全部とる
:: RET 1 2 3
echo %*
:: Parameter の数をとる
setlocal ENABLEDELAYEDEXPANSION
for %%i in (%*) do set /a cnt=!cnt!+1
echo パラメータ数は %cnt%
■ for
SYNTAX
FOR %%変数 IN (セット) DO command [param]
FOR /L %%変数 IN (開始,ステップ,終了) DO command [param]
DESC
(Set) 内のトークンを変数にセットしてひとつずつコマンドで処理する
WARNING
%変数 ではなく %%変数 でないとだめ
:: 連番 Directory をつくる
for %%i in (1 2 3) do mkdir test_%%i
:: 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
http://fireball.loafer.jp/kes/windows/article_104.html
http://pasofaq.jp/windows/command/normal.htm#nameid38
比較演算子
:: 文字列の比較 ( 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
)
EQU - 等しい
NEQ - 等しくない
LSS - より小さい
LEQ - 以下
GTR - より大きい
GEQ - 以上
:: 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 同様 )
:: BAD
:: コマンドの構文が間違っています
if aaa == %5 (
echo same
)
:: OK
if aaa == "%5" (
echo same
)
ELSE 節は IF の後のコマンドと同じ行におく
BAD
:: C のようにかけない
:: "ELSE" を命令として勘違いするらしい
IF EXIST filename. (
del filename.
)
ELSE (
echo filename. missing.
)
OK
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 の展開は失敗する
:: 別変数にセットしてからする
:: BAD
set pathbody=%1:~0,-4%
:: OK
tmp=%1
set ret=%tmp:~0,-4%
:: 結合は 展開の結果をそのまま使う
set a=tunoda
set b=hiro
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
■ quot
// VS でもできる
"copy $(TARGET)"
// < をはく
echo ^<
:: SAPCE があるときは ["] で quot する ( ややこしい ! )
:: BAD
c:/Program Files/foo/test.exe
:: OK
"c:/Program Files/foo/test.exe"
:: ["] は 引数には含まれない -> やっぱり含まれる ?
test.bat "argument"
/pro/bat/arg.bat "argument"
:: BAD
C:\Program" "Files\Windows" "Media" "Player\wmplayer.exe /play C:\mymus\Morning.wpl
:: OK
"C:\Program Files\Windows Media Player\wmplayer.exe" /play C:\mymus\Morning.wpl
■ Drive.のきりかえ
:: [:] を忘れずに, 大文字 小文字はどちらでも OK
:: BAD
d
:: OK
d:
:: OK
D:
■ Comment
REM comment
rem comment
:: comment
■ 文字.Code
WARNING
sjis-unix では 日本語はダメかも