20260824-dos-command-learn 課題

これから解決することの一覧。判断や選び方が要るものだけを残す

📅 作成: 2026-10-11 / 更新: 2026-10-12

資料の正確さ

i261011-01済英語の原文を確かめられていないエラーメッセージが 2 件ある

エラーメッセージは、実際に出る言語(英語)の原文と公式の日本語訳を並べる決まり。次の 2 件は、日本語環境でしか取れず、英語の原文が未確認のまま日本語だけを載せている。

  • 01 の第 2 章: パス演算子(%~dp0 等)の使い方が無効なときのメッセージ
  • 03 の第 4 章: UNC パスがカレントにできないときのメッセージ

実機の英語表示の cmd で出力を取れば確かめられる。推測で英文を書かない。

選び方: (A) 英語表示の環境で実測して原文を足す(推奨。決まりどおりになる) / (B) 実測できるまで日本語だけを載せ、その旨を本文に書く。→ A を採用。

結果: 英語のロケール資源(en-US の cmd.exe.mui)に原文があった。日本語側と突き合わせたところ、01 の日本語が公式と違っていた(「置き換え中で」→「置き換えで」、「使用方法」→「使用法」)。続く案内の行も足りなかったので、公式の全文に直した。UNC のメッセージも、続く 1 文と前置きの行を足した。

  • 済英語のロケール資源から 2 件の原文を取り、日本語側と突き合わせる
  • 済01・03・A1・A3 を直し、html2md を流す

サンプルの検証

i261011-02済サンプルの cmd を一括で実行して確かめる仕組みが無い

資料に載せた出力は、サンプルを実行して貼ったもの。ただし、あとからサンプルや資料を直したときに、出力がずれていないかを確かめる手段が無い(tests/ と tools/40_test/ が無い)。

サンプルは実行するとファイルを作るものと、コンソールのコードページで出力が変わるものがあり、そのまま一括実行はできない。作るなら、出力先を tmp/ にし、窓を SJIS(932)に固定して、期待値を先に手で書く形になる。

選び方: (A) tests/ に実行テストを作り、tools/40_test/ にランチャを置く(推奨。資料とサンプルのずれを機械で見つけられる) / (B) 作らず、直すたびに手で実行して確かめる運用にする。

選び方の結果: A を採用。tests/samples.test.ts と tools/40_test/run-tests を作った。新しい窓(windowsHide)で 932 に固定して実行し、tmp/ に写して走らせる。node --test と bun test の両方で通る。

  • 済出力が環境に依らない 7 本を対象にし、期待値を手で書く(01 の 01・02・03、02 の 01 の 2 本・02・04・06)
  • 済落ちることを確かめる(02-if.cmd の値を変えて実行し、落ちるのを見てから戻した)
  • 済残りの対象 13 本(01 の 04・05、02 の 03・05、03 の 5 本、テンプレート 3 本)。期待値の配列に正規表現を混ぜ、日時・絶対パスを受ける(tests/samples-env.test.ts)。引数は固定し、wmic の有無は実行時に見分ける

見つけた不具合

i261011-03済01 が「未定義の変数は元の文字列が残る」と書いていた(実際は空になる)

テストの期待値を手で書く過程で、実機と食い違うと分かった。バッチの中では、未定義の %VAR% は空文字に置き換わる。元の文字列が残るのは、コマンドプロンプトに直接打ったときだけ。実測した([%UNDEFINED_VAR%] が、バッチでは []、cmd /c に直接渡すと [%UNDEFINED_VAR%])。

02 の本文と A3 は、すでに「消える」と書いていて、01 とだけ食い違っていた。

  • 済01(比較表と第 2 章の 1 項目)・ZZ・A1 の記述と、サンプル 02-expand.cmd の表示を、実測どおりに直す
  • 済サンプルのテストで、[] になることを確かめる
i261012-01済資料のエラーメッセージが、公式・実機の文言とずれていた

公式のロケール資源(cmd.exe.mui と kernelbase.dll.mui)と実機の出力で、資料に載せた全メッセージを突き合わせた。

  • 01 の「コマンドの構文が正しくありません。」は誤り。公式は「コマンドの構文が誤っています。」(A3 はもともと正しかった)
  • A1・ZZ の「この時点では予期されていません。」は公式の訳ではない。実機は「x の使い方が誤っています。」(英語は x was unexpected at this time.)
  • A1・ZZ・A3 の表と症状に、英語の原文が無かった。「指定されたパスが見つかりません。」(The system cannot find the path specified.)は kernelbase.dll.mui で確かめた
  • 済01・A1・A3・ZZ を直し、英語の原文を足す
  • 済tests/messages.test.ts を足す(実機の出力と資料の文言を突き合わせる)
  • 済ZZ のファイル構成に tests/ と tools/40_test/ を足す
i261012-02済03 のサンプル 01 の方法 2 が、wmic の無い環境で崩れた表示になる

残りのサンプルのテストを書く過程で見つけた。Windows 11 の新しい版には wmic が無い。LDT が未定義のまま !LDT:~0,8! が展開され、結果 = [~0,8C:/Tools/nodejs/nodeLDT:~8,6] のような表示になる。資料 03 の方法 2 は、すでに「非推奨・将来削除される予定」と書いているが、削除済みの環境で何が起きるかは書いていない。

選び方: (A) 資料 03 の方法 2 に、「削除された環境では動かず、表示も崩れる」と書き足す。サンプルは非推奨の見本としてそのまま残す(推奨。方法 2 は使わせないための例示で、直す意味が薄い) / (B) サンプルに wmic の有無を確かめる行を足し、無ければ「この環境には wmic が無い」と表示する。

  • 済テストは wmic の有無を実行時に見分けて通す
  • 済A を採用し、資料 03 の方法 2 に、wmic の無い環境で崩れることを書き足す(ビルド 26300 で確認)
i261012-03済shift が %0 もずらすことを、資料が書いていない

shift は %1 以降だけでなく %0 もずらす。03 のサンプル 04・05 は、オプションの解析(shift)のあとで使い方を出すと、「使い方: -v …」のようにファイル名が -v になっていた。資料 03 の引数解析の節は、使い方に %~nx0 を使うと説明しているが、shift のあとでは名前が変わることを書いていない。

選び方: (A) A3(落とし穴カタログ)に項目を足し、03 の引数解析の節からリンクする(推奨。症状・原因・修正の形で引ける) / (B) 03 の引数解析の節に 1 文の注意だけを足す。

  • 済サンプル 04・05 を、解析の前に名前を控える形に直す(set "SELF=%~nx0")
  • 済落ちるテストを足し、修正前の版で落ちることを確かめる
  • 済A と B の両方を採用する。A3 に #15 を足し(症状の表・分類・ZZ の落とし穴リスト・A1 の逆引き・README の項目数を含む)、03 の引数解析の節に注意とリンクを足す
  • 済A3 の項目数(見出しの数と、副題・README・ZZ の「N項目」)が一致することを確かめるテストを足す(tests/docs.test.ts)