Windows コマンドのヘルプをテキストファイルに書き出してみる

コマンドプロンプト初心者が、コマンドを勉強する時の参考になればと思い、こんなネタをやってみた。

Help コマンドは、引数に与えたコマンドの使い方を教えてくれる。そして、引数を与えずに呼ぶと、コマンドプロンプト標準のコマンド一覧と簡単な説明を返してくれる。

これを利用して、Help コマンドで出てくるコマンドのヘルプ文章を、コマンドごとにテキストファイルに書き出してみる

@Echo Off

Pushd %0\..

For /f "tokens=1*" %%a In ('Help') Do (
  Echo.%%a | Findstr /r "^[A-Z][ABCDEFGHIJKLMNOPQRSTUVWXYZ]" > Nul
  If Not ERRORLEVEL 1 (
    Help %%a > %%a.txt
  )
)

Exit /b

Pushd %0\.. でバッチファイルがあるフォルダをカレントディレクトリにしている。

For コマンドは色んなことができて分かりづらいが、今回は In ('Help') とあるように、Help コマンドの結果を1行ずつ処理するループになっている。tokens=1* とだけ書いてあるので、delims 未指定の場合は1行の内容がスペースで区切られて %%a 以降の変数にセットされていく。コマンドプロンプトは %%a とだけ書けば、次の変数名は空気を読んで %%b%%c …と名前を変えていってくれる。ただし今回は tokens=1* としたので、スペースで区切られたあとの値は、行末まで全て %%b にセットされ、%%c は作られない。そして今回は %%b に入る値は不要なので %%b も登場していない。

Help コマンドの一覧は「コマンド 概要」と記述されているのだが、概要の文章が改行されているため、行頭がアルファベットで始まる行のみを取り出し、先頭の単語 = コマンド名を取得しようとしている。

しかし、改行された概要文の中に、説明文として「Windows」という単語が行頭にくる部分がある。そのため、「Windows」から始まる行を除外するために、行頭から大文字のアルファベットが2文字連続で登場する行を探さなくてはならない。

だがここで問題なのは、Findstr の範囲マッチは大文字小文字の区別をしないらしく、^A-Z][A-Z] と書いても「[Windows」を除外できなかった。そこで苦肉の策で、範囲マッチではなくクラスマッチに大文字アルファベットを羅列した。

こうしてコマンドのみを取り出すことができたので、Help コマンドの引数にそのコマンド名を渡し、結果をファイルに出力しているワケである。

テキストファイルにしておけばコマンドプロンプトを叩かずとも読めるので、初めのうちはこんなカンペを作ってみても良いかもしれない。