バッチのメモ

バッチの書き方

引数

コマンドの引数に指定した値を使う時は%を使う。

hoge.bat 引数1 引数2
echo %1
echo %2

変数

変数を設定する時はSETコマンドを使う。

SET VAR

変数を参照する時は%で囲む。

echo %VAR%

変数に数値を代入する時は /a オプションをつける

SET /a VAR=12345

変数に文字列を代入するときはダブルクォーテーションで囲む必要はない。

SET VAR=hoge

変数スコープ

変数をローカル化するにはsetlocalendlocalで囲む。
囲んだスコープ内だけで変数が有効になる。

@echo off
setlocal
SET VAR=hoge
echo %VAR%
endlocal
echo %VAR%

一回目のechoでだけ変数VARが有効になっている。

遅延環境変数

遅延環境変数を設定するにはsetlocalのあとにenabledelayedexpansionをつけます。

@echo off
setlocal enabledelayedexpansion
rem コマンドを書く
endlocal
遅延環境変数とは

変数を読み込むタイミングを遅らせる変数。

これまで変数を%で囲んでいたが、%だとその変数を見つけた瞬間すべてを展開するので、以下のような場合に悲しいことが起きてしまう。

@echo off
setlocal enabledelayedexpansion
SET COUNT=0
for %%i in (*.html)do(
  SET /a COUNT=%COUNT% + 1
)
echo %COUNT%
endlocal

結果

0

for文の中でCOUNTに+1したのに、COUNTが0のまま展開されてしまうから、結果は0になる。

そうなってしまうのを防ぐために、setlocalのあとにenabledelayedexpansionをつけて、変数は%ではなくて!で囲む。

遅延環境変数についてQiitaの記事
http://qiita.com/sawa_tsuka/items/c7c477cacf8c97792e17

@echo off
setlocal enabledelayedexpansion
SET COUNT=0
for %%i in (*.html)do(
  SET /a COUNT=!COUNT! + 1
)
echo !COUNT!
endlocal

結果(htmlファイルが4つある場合)

4

遅延環境変数にすることで期待通りの結果になる。

if文

if文の中の処理は()で囲む。

SET VAR=1
if VAR == 1 (
  echo %VAR%
)

for文

for文は以下のように書く。

SET VAR=hoge
for %%i in (ループの条件) do(
  echo %VAR%
)

ループ条件を以下のように書くと、カレントディレクトリにあるhtmlファイルを対象にループを回すことができる。

SET VAR=hoge
for %%i in (*.html) do(
  echo %VAR%
)

コメント

コメントを書く時はremコマンドを使う。

rem コメントを書く