【コマンドプロンプト(bat)】テキストファイルをbat引数に渡しループ処理させる

コマンドプロンプト(bat)

えっ?bat引数にテキストファイルを…!?…で、できらぁ!!!

batへ引数としてテキストファイルを渡し、各行ごとにデータ解析させコマンドを動作させます。

 

困りごと

この記事で以下のことが解決します。

  • batに複数引数を渡したい
  • batを1度の起動で複数の処理をさせたい

解消方法

forというコマンドを使用することで解消できます。

forコマンドとは、ある処理を複数回(ループ)行うことができるコマンドです。

 

使用方法は以下の通りです。

  • bat上で”for /F [“オプション”] %変数 IN (ファイル セット) DO コマンド [コマンド パラメーター]”と入力して実行

 

なんのこっちゃ分からへん

ですよね。このままだと説明は難しいので、次章からケースを交えて詳細な説明をしていきます。

各ケースの対応方法

batに複数引数を渡したい

インプットとなるテキストファイルに第1引数と第2引数を記載し、ファイル自体をbatに渡して実行させる場合です。

forへの引数と挙動は以下とします。

  • 第1引数:移動先フォルダパス (cdコマンド実行)
  • 第2引数:表示対象フォルダ (dirコマンド実行)

 

インプットとなるファイルはこんな感じです。

ファイル名:FileLists.csv

フォルダ構成については以下の記事を参照ください。

【コマンドプロンプト(bat)】フォルダ構成一覧をテキストで取得
コマンドであるフォルダ配下全ての構成一覧をテキストで取得する方法です。 これぞCUIだからこそ表現ができるって感じですね! 困りごと この記事で以下のことが解決します。 フォルダ構成とファイル配置場所を全て確認した...

 

 

batの中は以下のようになっています。

ファイル名:ForToFileArg.bat

@echo off

for /f "delims=, tokens=1,2" %%a in (%1) do (
  @echo 移動先フォルダパス:%%a
  cd %%a
  @echo 表示対象フォルダ:%%b
  dir /B /S %%b
  @echo.
)

pause

各要点は詳細は以下を参照してください。

 

%[数字]

batに対して渡される引数となります。

今回の例だとコマンドプロンプト上で以下のような指定となり、第1引数がbat内の処理へ渡されます。

ForToFileArg.bat [第1引数]

 

[“オプション”] 

delims

引数として渡されたファイルの行ごとのデータの区切り文字を指定します。

今回は、インプットをcsvファイルにしたためカンマ(,)が区切り文字としています。

 

tokens

delimsの区切り文字で分解(split)された値の何個目を取得するかを指定します。

ちなみに個別で取得したい場合はカンマ(,)で指定し、範囲で取得した場合はハイフォン(-)を使用します。

 

カンマ指定の場合の例としては、

  • 1個目と2個目を取得:1,2
  • 3個目と4個目を5個目を取得:3,4,5

ハイフォン指定の場合の例としては、

  • 1個目と2個目を取得:1-2
  • 3個目と4個目を5個目を取得:3-5

 

%%[英語1文字]

forコマンド内では変数として扱われます。

 

1文字とか何の変数か分からんやん!

分かりやすい変数名を付けたいところですが、これはforコマンドとしてのルールなのでどうしようもありません(笑)

 

今回の例では、%1のファイルセットを%%aに格納しdelimsとtokensを指定しているので、forコマンドでは

  • %a ⇒ 1個目の文字列[移動先フォルダパス]
  • %b ⇒ 2個目の文字列[表示対象フォルダ]

が格納されます。

 

ちなみに、tokensで指定した数で英語がアップしていきます。

etc. 1個目=a、2個目=b、3個目=c

 

 

FileLists.csvForToFileArg.batにドラッグドロップして実行結果を見てみましょう。

※コマンドプロンプト上で、”[フォルダパス]\ForToFileArg.bat [フォルダパス]\FileLists.csv”と指定して実行でもよい

といったように、cdでカレントパスへ移動し、dirで配下のパスを表示できました。

 

batを1度の起動で複数の処理をさせたい

複数の処理をさせる場合です。batとフォルダ構成は上記パターンと同じものを使用します。

インプットとなるファイルはこんな感じです。

 

ファイル名:FileLists2.csv

要は、FileLists.csvに1行追加されているだけです。

 

FileLists22日.csvForToFileArg.batにドラッグドロップして実行結果を見てみましょう。

※コマンドプロンプト上で、”[フォルダパス]\ForToFileArg.bat [フォルダパス]\FileLists2.csv”と指定して実行でもよい

行ごとにループ処理がされるため、各行の引数ごとに結果が変わっているのが分かると思います。

 

まとめ

  • forコマンドでは引数としてファイルを渡せる
  • 引数として渡したファイルの行数分の処理が繰り返し実行される
  • 引数として渡したファイルの中には複数の引数が指定できる

 

今回は分かりやすく、cdとdirコマンドを使用しましたが、mdxcopyコマンドなどを併用すると、色んな用途に使用できると思います。

 

こんな使い方してるよ!といった情報をコメントを残して頂けるとworkoutがとても喜びます!

 

コメント メアドは任意