| 方法 | 手順 | 備考 |
|---|---|---|
| ダブルクリック | エクスプローラでファイルをダブルクリックする | 引数が不要なサンプルはこれで動く。末尾に pause があるので結果を読める |
| コマンドプロンプト | フォルダを開いて samples\01\01-hello.cmd のように実行する | 引数が必要なサンプルはこちら |
| エクスプローラのアドレスバー | アドレスバーに cmd と入力するとそのフォルダでコマンドプロンプトが開く | パスを打つ手間が省ける |
引数が必要なサンプルは、引数なしで実行すると使い方(usage)が表示されます。
pause が入っています。ダブルクリック実行で結果を読むためです。実務のバッチでは、無人実行するものに pause を入れてはいけませんbackup\ sorted\ log\)は各サンプルと同じフォルダに作られます。不要になったらフォルダごと削除してくださいコンソールのコードページが 65001(UTF-8)だと日本語が化けます。ファイルが正しくても化けるので、その場合は chcp で確認してください。932 でなければ、コマンドプロンプトを新しく開き直すか、chcp 932 を実行してから試してください。詳細は落とし穴 #3 にあります。
01\)資料: 第1回 バッチの実行モデル
| ファイル | 内容 | 引数 |
|---|---|---|
01-hello.cmd | echo と rem の確認 | なし |
02-expand.cmd | 「置換してから実行する」ことの確認。未定義変数 / set の書き方の違い / %% / 記号を含む値の再解析 | なし |
03-errorlevel.cmd | 終了コードの確認。&& と ||、if errorlevel が「以上」であること | なし |
04-args.cmd | 引数とチルダ修飾子の一覧表示 | ファイルパス |
05-backup.cmd | デモの完成版。日付付きの名前で backup\ にコピーする | ファイルパス |
rem 引数が必要なサンプル
samples\01\04-args.cmd "samples\01\sample.txt" abc
samples\01\05-backup.cmd "samples\01\sample.txt"
01-hello.cmd の1行目 @echo off を rem @echo off に変えて実行する。実行される行そのものが表示されるのが分かります。これが動かないバッチを調べる最初の手段です02-expand.cmd の === 5 === の出力を見る。%MSG% は壊れ、!MSG! は正しく表示されます02\)資料: 第2回 制御構文と展開の罠
| ファイル | 内容 | 引数 |
|---|---|---|
01-delayed-ng.cmd | 失敗版%VAR% でループを回して 0 のままになる例 | なし |
01-delayed-ok.cmd | 修正版!VAR! にした版 | なし |
02-if.cmd | if の4つの形と数値比較 | なし |
03-for.cmd | for の4つの形。usebackq による意味の切り替えも確認できる | なし |
04-string.cmd | 部分取得・置換・含有判定 | なし |
05-subroutine.cmd | サブルーチンと戻り値の2つの方法 | なし |
06-sort.cmd | デモの完成版。ファイルを拡張子ごとに sorted\ へ振り分ける | 省略可 |
| ファイル | 用途 |
|---|---|
data.txt | for /f で行を読む例 |
data file.txt | 空白を含むファイル名。usebackq が必要になる例 |
list.csv | tokens / delims / skip の例 |
testfiles\ | 06-sort.cmd の振り分け対象(.txt .log .png と拡張子なし) |
01-delayed-ng.cmd と 01-delayed-ok.cmd を続けて実行して見比べる。違いは %COUNT% と !COUNT! だけです03-for.cmd の === 4 === を見る。引用符の有無で、ファイルの中身を読むか文字列そのものを読むかが変わります06-sort.cmd を実行して sorted\noext\ に LICENSE が入ることを確認する。ここは空の変数に置換記法を使うと壊れる箇所です03\)資料: 第3回 実務で使えるバッチを書く
| ファイル | 内容 | 引数 |
|---|---|---|
01-datetime.cmd | 日時取得の3つの方法を並べて実行し、結果を見比べる | なし |
02-errorhandling.cmd | エラー処理の型。robocopy が成功でも 0 以外を返すことも確認できる | なし |
03-logging.cmd | ログ出力。2>&1 の位置による違いを実演する | なし |
04-args.cmd | 引数解析(shift ループ)とヘルプ表示 | 省略可 |
05-backup.cmd | 第1回のバックアップを配布可能な形に仕上げた最終版 | ファイルパス |
rem ヘルプを表示する
samples\03\04-args.cmd
rem オプション付きで実行する
samples\03\04-args.cmd -v -o out.txt "samples\03\sample.txt"
rem バックアップの最終版(-v で詳細表示)
samples\03\05-backup.cmd -v "samples\03\sample.txt"
01-datetime.cmd で3つの方法の結果を比べる。%TIME% の生の値に先頭の空白があることを確認してください03-logging.cmd を実行し、生成された log\demo_yyyymmdd.log を開く。「誤った形」のエラーがログに入っていないことが分かります05-backup.cmd を引数なしで実行してヘルプを確認し、次に存在しないパスを渡して終了コードを確認する(echo %errorlevel%)テンプレートは templates\ にあります。サンプルは説明のために書かれていますが、テンプレートはコピーして使うためのものです。新しくバッチを書くときは templates\tool.cmd から始めてください。