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
:: 1 2 3 4 5
FOR /L %%i IN (1,1,5) DO echo %%i
:: 5 4 3 2 1
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
:: 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
SYNTAX
// {} でないよ ! () だよ !
IF [NOT] ERRORLEVEL 番号 code
IF [NOT] 文字列1==文字列2 code
IF [NOT] EXIST ファイル名 code
IF defined 変数 ( code ) [else code ]
:: 文字列の比較
IF var == 7 (
echo same
) ELSE (
echo diff
)
:: Insentive指定( 大文字, 小文字の違いは無視する )
if /I Test == test (
echo same
) else (
echo diff
)
:: 文字列が数値のみなら 数値に変換されて大小比較
if 10 LSS 12 (
echo 10 は 12 より小さい
) else (
echo false
)
EQU - 等しい
NEQ - 等しくない
LSS - より小さい
LEQ - 以下
GTR - より大きい
GEQ - 以上
ERRORLEVEL で処理をわける
if %ERRORLEVEL% == 0 (
)
:: 否定は not を使う。 != はできない。
if not %ERRORLEVEL% == 0 (
goto ERROR
)
WARNING
:: 次の表記もできるが、誤解しやすいので推奨しない
:: 0 以上ならば
if %ERRORLEVEL% 0 (
)
:: 1 以上ならば
if %ERRORLEVEL% 1 (
)
:: 3 未満ならば
if not %ERRORLEVEL% 3 (
)
:: directory の有無をチェック
IF exist dir (
) ELSE (
)
:: file の有無をチェック
IF exist test.txt (
) ELSE (
)
:: 変数が定義されているかどうかチェック
IF defined v ( echo Def ) ELSE ( echo NotDef )
:: 環境変数があるかどうか
IF defined USERNAME ( echo Def %USERNAME% ) ELSE ( echo NotDef )
WARNING
:: 以下の記述はエラーになる。
if aaa == aaa
(
echo "same"
)
引数が空だと問題がある
理由は %1 が変数展開されると次のようになる。
:: BAD
:: コマンドの構文が間違っています
if aaa == %1 (
echo same
)
:: %1 の展開後の結果
if aaa == (
)
:: そこで "" 囲む。
:: OK
if "aaa" == "%1" (
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.
)
:: 一行にしても良い。
IF EXIST filename. (del filename.) ELSE echo filename. missing
___
■ prompt . dialog
SET /P < var>=[< prompt message>]
SET /P id=Please enter your name:
IF "%id%"=="" GOTO Error
___
■ 変数
___
■ 変数(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!
)
___
■ 文字列(String)
___
■ 長さ(length)
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文字
___
■ 置換(replace)
set V=aaa
:: bbb
echo %V:a=b%
:: abc
echo %V:aaa=abc%
コマンドがないため for で対応をする
:: 変換したい文字列をセット
set src=d:\foo\bar
echo %src%
em 置換する文字
set search=\
:: 置換後の文字
set replace=/
:: 変数初期化
set dst=
set tmp=
:loop
if "%src%" == "" goto :end
for /f "tokens=1* delims=%search%" %%A in ("%src%") do (
set dst=%dst%%tmp%%%A
set src=%%B
set tmp=%replace%
)
goto :loop
:end
echo %dst%
___
■ 抽出
SYNTAX
%var:~OFFSET,LENGTH%
:: 0 番目 から 2 つ
:: ai
set var=aiueo
echo %var:~0,2%
:: 後ろから 4 つ目より後
:: .txt
set var=foo.txt
echo %var:~-4%
:: 後ろから 4 つを消す
:: foo
set var=foo.txt
echo %var:~0,-4%
:: 2 番目から後ろ
:: ueo
set var=aiueo
echo %var:~2%
:: Argument の展開は失敗する
:: 別変数にセットしてからする
:: BAD
set pathbody=%1:~0,-4%
:: OK
tmp=%1
set ret=%tmp:~0,-4%
___
■ 結合(concat)
結合は 展開の結果をそのまま使う
set a=kato
set b=taka
echo %a%%b%
___
■ 算術演算(Math)
___
■ Math
SYNTAX
set /a expression
DESC
Expression を数式として評価する
SYNTAX
cd [op] dir
DESC
Directory の移動
OP
D: path に Drive が含まれる場合は, drive も変更.
C:\test> chdir /D d:\test
:: 相対で移動
c:\> cd WINDOWS
:: 絶対パスで指定 ( 拡張機能 ON ならば Space は区切り文字でない )
c:\WINDOWS> cd c:\Documents and Settings
:: OFF なら quot する ( ややこしい )
c:\WINDOWS> cd "c:\Documents and Settings"
___
■ cmd
DESC
cmd( Interpreter )を ChildProcess として起動する
ProcssExplorer で見ると 階層化するのが見える
OP
k : Boot 時にコマンドをフック
c : コマンドのみ実行をして Interpreter を終了
POINT
起動設定をしておく
437 IBM437 OEM United States
932 shift_jis ANSI/OEM Japanese; Japanese (Shift-JIS)
1200 utf-16 Unicode UTF-16, little endian byte order (BMP of ISO 10646);
available only to managed applications
20127 us-ascii US-ASCII (7-bit)
20932 EUC-JP Japanese (JIS 0208-1990 and 0121-1990)
50220 iso-2022-jp ISO 2022 Japanese with no halfwidth Katakana;
Japanese (JIS)
50222 iso-2022-jp ISO 2022 Japanese JIS X 0201-1989;
Japanese (JIS-Allow 1 byte Kana - SO/SI)
51932 euc-jp EUC Japanese
65001 utf-8 Unicode (UTF-8)
SYNTAX
del [op] [File ...]
del [op] [Directory ...]
DESC
指定ファイルを消去
指定ディレクトリ内のファイルを消去
OP
P : Prompt を消す前に表示
S : SubDirectory も含めてすべての指定ファイルを削除
A : Attribute 消すファイルの属性を指定する
:: CurrentDirectory のファイルをすべて消去
:: ( SubDirectory は検索されない )
del /P *
:: ".txt" ファイルをすべて削除
:: ( SubDirectory も対象 )
del /S /P *.txt
:: すべてのファイルを削除
del /S *.jpg *.png *.htm *.css
:: 隠しファイルを消す
del /A:H c:\pagefile.sys
:: つけないと "ない" といわれる
del c:\pagefile.sys
WARNING
Directory 自身は削除できない
"rmdir" を使う
rmdir Directory
___
■ dir
SYNTAX
dir [op]
DESC
ディレクトリのファイルの一覧を表示
:: C:\ のファイルを表示
dir C:\
:: CurrentDirectory を表示
dir
:: 所有者を表示
dir /Q
:: File名のみの Short 形式で表示
dir /w
:: Wildcard で指定する
dir *.txt
:: File名のみ表示
dir /B
:: すべての種類( 隠しファイルも含めて )
dir /A
:: ソートする。
dir /O*
:: 変更日時でソート
dir /OD
:: C:/foo をつくる
mkdir c:\foo
:: 再帰的 につくってくれる
:: ( 拡張機能が ON のとき ) -> Default ON
mkdir c:\oya\ko\mago
:: 拡張機能 を ON にする
cmd /e:on
:: OFF にすると 作成できない
cmd /e:off
:: ディレクトリまたはファイルを作成できません
mkdir c:\oya\ko
___
■ mklink
SYNTAX
mklink link target
DESC
SymbolicLink を作成
:: d:/tmp への shortcut を test という名前で作成
mklink /d test d:\tmp
___
■ net use . NetworkDrive
SYNTAX
NET USE [デバイス名 | *] [パスワード | *] [/home]
DESC
別PC( ファイルサーバなど )の共有フォルダを
自分の PC のドライブに割りあてる
:: mount を自動化する
:: hostname\dir を K: としてマウント
net use K: \\hostname\dir password /user:username
WARNING
Driveletter の後は : をつけること
:: BAD
net use K \\hostname\dir password /user:username
:: OK
net use K: \\hostname\dir password /user:username
:: mount を 消す
net use z: /DELETE
:: コンピュータ名 "mypc" の "share" を K: にマッピングする
net use K: \\mypc\share
:: 現在マッピング接続しているデバイスの一覧を表示
net use
ステータス ローカル名 リモート名 ネットワーク名
-------------------------------------------------------------------------------
OK K: \\mypc\share Microsoft Windows Network
___
■ tracert . traceroot
指定したホストまでの経路を表示する。
tracert www.google.com
家の PC では PrivateAddress であるルーターに最初に通信する。
1 < 1 ms < 1 ms < 1 ms 192.168.24.1
ISP に接続する
1 < 1 ms < 1 ms < 1 ms xxx.xxx.xx.x
SYNTAX
net user
DESC
user の一覧を表示
Administrator は System 標準の user
Administrators は Group 名
POINT
user ごとに 細かい Permission 制御をする
Guest は アカウントをもたない来客用のアカウント。