wiki:dokuwiki:dos:コマンドプロンプトのfor文

コマンドプロンプト便利

コマンドプロンプトのfor文って一回覚えるとすごく便利なんですよね。みんな使わないけど。というわけで、ファイル一覧を取得するようなfor文を作ってみようと思います。
あっ、そうだ。一覧取得するだけなら、for文いらんかったですね。

  1. dir /s /b

本当にこれだけなんですよね。もちろん、ディレクトリだけとか、サブディレクトリだけを表示するのもすごく簡単なんです。

  1. dir /b /AD

まぁ詳しくはヘルプを読んでください。
何が便利かっていうと、たとえばC#かなんかで、ファイルの一覧を取得するなんていったら、もっと複雑な内容を書かないとあかんわけですね。
touchコマンドと同様に、更新日付を変更なんてしようと思ったら、C#なら例外処理を施して、引数をちゃんと定義して・・・と面倒なことばかりせなあかんわけです。でも、ところがどっこい、コマンドプロンプトなら5行くらいでさくっとできてしまうのですよね。。。

コマンドプロンプトで更新日付を変更する

甘かった。コマンドプロンプトではできませんでした。PowerShellを使うらしいです。 PowerShellって何かとコマンドレットが長くて嫌い。

まあでも、こいつの「Program.cs」の更新日付を2024/01/01にしてみる。

  1. Set-ItemProperty Program.cs -Name LastWriteTime -Value "2024/01/01 00:00:00"

結果がこちら。

コマンドプロンプトのfor文

全てのファイルの更新日付を変更しようと思うと、今度はPowerShellのFOR文を覚えないといけなかったりするわけで、(新しいものを覚えるのが)面倒なので、コマンドプロンプトのFOR文を使用しながら、更新日付を変更することを考える。
それがこちら

  1. for /f "usebackq delims==" %i in (`dir /s /b`) do (
  2. More? powershell -Command "Set-ItemProperty %i -Name LastWriteTime -Value \"2024/01/01 00:00:00\" "
  3. More? )

ちなみに、コマンドプロンプトのFOR文についての詳細は、ヘルプを見るのが一番良い。

  1. 指定されたコマンドをファイル セットの各ファイルに対して実行します。
  2.  
  3. FOR %変数 IN (セット) DO コマンド [コマンドパラメーター]
  4.  
  5. %変数 単一文字の置き換え可能なパラメーターを指定します。
  6. (セット) ファイル セットを指定します。ワイルドカードを使用できます。
  7. コマンド 各ファイルごとに実行するコマンドを指定します。
  8. コマンドパラメーター
  9. 指定されたコマンドのパラメーターまたはスイッチを指定します。
  10.  
  11. バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、
  12. %%変数を使用してください。変数名では大文字と小文字が区別されるため、
  13. %i %I は異なります。
  14.  
  15. コマンド拡張機能を有効にすると、次の FOR コマンドの追加形式
  16. がサポートされるようになります:
  17.  
  18. FOR /D %変数 IN (セット) DO コマンド [コマンド パラメーター]
  19.  
  20. セットがワイルドカードを含む場合は、ファイル名ではなくディレクトリ名
  21. の一致を指定します。
  22.  
  23. FOR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンド パラメーター]
  24.  
  25. [ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
  26. ます。/R の後にディレクトリが指定されていない場合は、現在の
  27. ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
  28. ディレクトリ ツリーの列挙だけを行います。
  29.  
  30. FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメーター]
  31.  
  32. セットは、ステップの量ごとに変化する開始から終了までの数列です。
  33. たとえば、(1,1,5) 1 2 3 4 5、(5,-1,1) (5 4 3 2 1) という数列に
  34. なります。
  35.  
  36. FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
  37. [コマンド パラメーター]
  38. FOR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメーター]
  39. FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメーター]
  40.  
  41. または usebackq オプションの場合:
  42.  
  43. FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
  44. [コマンド パラメーター]
  45. FOR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメーター]
  46. FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター]
  47.  
  48. ファイル セットは、1 つ以上のファイル名です。各ファイルが開かれ、
  49. 読み取られ、処理されてから、ファイル セットの次のファイルに進みます。
  50. 処理では、ファイルの読み取り、個々のテキスト行への分割と、0 個以上の
  51. トークンへの解析が行われます。その後、見つかったトークン文字列を変数値に
  52. 設定して for ループの本体が呼び出されます。既定では、/F は、各ファイルの
  53. 各行から、空白で区切られた最初のトークンを取得して渡します。空白行は
  54. スキップされます。既定の解析動作を変更するには、省略可能な "オプション"
  55. パラメーターを指定します。これは、異なる解析オプションを指定する 1 つ以上の
  56. キーワードを含む、引用符で囲まれた文字列です。キーワードは、次のとおりです:
  57.  
  58. eol=c - 行末のコメント文字を指定します (1 文字)。
  59. skip=n - ファイルの先頭でスキップする行数を指定します。
  60. delims=xxx - 区切り文字のセットを指定します。
  61. これは、既定の区切り文字であるスペースとタブを
  62. 置き換えます。
  63. tokens=x,y,m-n - 各繰り返しに対して、各行から for 本体に渡す
  64. トークンを指定します。これにより、追加の変数名が
  65. 割り当てられます。
  66. m-n の形式は範囲で、m 番目から n 番目の
  67. トークンを指定します。
  68. tokens= 文字列の最後の文字がアスタリスクである場合は、
  69. 追加の変数が割り当てられ、最後のトークンが解析された
  70. 後、行に含まれている残りのテキストを受け取ります。
  71. usebackq - 次の新しい表示形式を指定します。
  72. 逆引用符で囲まれた文字列がコマンドとして実行され、
  73. 一重引用符で囲まれた文字列がリテラル文字列コマンドに
  74. なり、ファイル セットのファイル名を二重引用符で
  75. 囲めるようになります。
  76.  
  77. 例を参考にしてください:
  78.  
  79. FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
  80.  
  81. この例は、myfile.txt の各行を解析します。セミコロンで始まる行を無視し、
  82. 各行の 2 番目と 3 番目のトークンを for 本体に渡します。
  83. トークンは、コンマまたはスペースで区切られています。
  84. for 本体の文が %i 2 番目のトークンを、%j 3 番目のトークンを取得し、
  85. %k 3 番目以降のすべてのトークンを取得していることに
  86. 注意してください。
  87. スペースを含むファイル名に対しては、二重引用符でファイル名を引用する
  88. 必要があります。
  89. この方法で二重引用符を使うためには、usebackq オプションも
  90. 使わなければなりません。
  91. 使わなければ、二重引用符はリテラル文字列の定義として
  92. 解釈され、解析されます。
  93.  
  94. %i for 文で明示的に宣言され、%j %k tokens= オプションで暗黙的に
  95. 宣言されています。
  96. tokens= 行を使って 26 個までのトークンを指定できますが、
  97. 文字 'z' または 'Z' よりも高い変数を宣言することはできません。FOR 変数名は
  98. 単一の文字で、大文字と小文字を区別し、グローバルなものであり、一度に
  99. アクティブにできるのは合計 52 個までです。
  100.  
  101. また、かっこで囲んだファイル セットを一重引用符で囲み、文字列にすることに
  102. より、即時の文字列に対する FOR /F 解析ロジックを使うこともできます。
  103. これは、ファイルからの単一入力行として処理されます。
  104.  
  105. 最後に、FOR /F コマンドを使って、コマンド出力を解析することができます。
  106. かっこの中のファイル セットを逆引用符で囲みます。この文字列は、コマンド
  107. ラインとして子 CMD.EXE に渡されます。出力はメモリにキャプチャされ、
  108. ファイルのように解析されます。
  109. 例:
  110.  
  111. FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
  112.  
  113. この例は、現在の環境の環境変数名を列挙します。
  114.  
  115. また、FOR 変数参照の置換も拡張されました。
  116. 次のオプション構文を使うことができます:
  117.  
  118. %~I - すべての引用句 (") を削除して、%I を展開します。
  119. %~fI - %I を完全修飾パス名に展開します。
  120. %~dI - %I をドライブ文字だけに展開します。
  121. %~pI - %I をパス名だけに展開します。
  122. %~nI - %I をファイル名だけに展開します。
  123. %~xI - %I をファイル拡張子だけに展開します。
  124. %~sI - 展開されたパスは短い名前だけを含みます。
  125. %~aI - %I をファイルの属性に展開します。
  126. %~tI - %I ファイルの日付/時刻に展開します。
  127. %~zI - %I ファイルのサイズに展開します。
  128. %~$PATH:I - PATH 環境変数に指定されているディレクトリを
  129. 検索し、最初に見つかった完全修飾名に %I を
  130. 展開します。
  131. 環境変数名が定義されていない場合、または検索
  132. してもファイルが見つからなかった場合は、この
  133. 修飾子を指定すると空の文字列に展開されます。
  134.  
  135. 修飾子を組み合わせて、複合結果を得ることもできます:
  136.  
  137. %~dpI - %I をドライブ文字とパスだけに展開します。
  138. %~nxI - %I をファイル名と拡張子だけに展開します。
  139. %~fsI - %I を完全なパスと短い名前だけに展開します。
  140. %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
  141. 検索して %I を探し、最初に見つかったファイル
  142. のドライブ文字とパスだけに展開します。
  143. %~ftzaI - %I を DIR コマンドの出力行のように展開します。
  144.  
  145. 上の例の %I と PATH は、他の有効な値で置き換えることができます。
  146. %~ 構文は、有効な FOR 変数名によって区切られます。%I のような大
  147. 文字の変数を使うと読み取りやすく、大文字と小文字を区別しない修飾子
  148. との混乱を避けることができます。

何かとツールが必要な時に、C#だのJavaだの面倒な思いをして作るより、コマンドプロンプトのFORさえしっかり使いこなしてしまえば、「ちょっと楽しよう」くらいのツールなら作成できる。ヘルプを見てもらえれば、結構高機能なことがわかると思います。

  1. ファイルの中身を1行ずつ読み込んでデリミタでsplitした結果を用いて、処理をする。
  2. コマンド出力を使用して、1行ずつ処理をする。

私は、特に後者の頻度の方が多いと思いますが、使ってしまえば簡単なので、是非ともおすすめします。
「usebackq」バッククオテーション(逆引用符)オプションを使用すると、コマンドの結果を1行ずつ処理することができる。逆引用符は Shift+「@」キーだ。これで「`」が打てる。

  • wiki/dokuwiki/dos/コマンドプロンプトのfor文.txt
  • 最終更新: 2024/11/04 00:47
  • by 127.0.0.1