ぱちコマな日々

ざれごと、たわごと、うわごと、しごと。

イテレータ的なbatファイルテンプレートを作ってみた

確認環境

Spec / Version
PC mouse LB-J770X-SH2
OS Windows10 Home (ver 1709 build 16299.15)

概要

最近、batファイルを書く機会があったのですが、構文もろくに覚えてないので色々ハマりました。
今更この摩訶不思議ルールを覚える気も起きないので、ひとまずよく使う処理だけまとめたテンプレート的なものを作ろうと一念発起。
もうやだ。batファイル触りたくない。
 
苦労して出来たものは、引数で指定したコマンドに引数で指定したファイルパスを渡して実行するためのbatファイルです。何だか無意味なものな気がしますね。
ひとまずコマンドヘルプはこんな感じ。

C:\path\to>iter.bat /h
 iter.bat 実行コマンド 対象ファイル [/f /h /i /n /r]

   /f 第2引数のファイルの各行を引数として第1引数のコマンドを実行する
   /h このヘルプを表示
   /i 各ファイルに対して処理を実行する対話的に確認しながら実行する
   /n 各ファイルに対して存在有無をチェックしない
   /r 第2引数のファイルがあるディレクトリ以下を再帰的に検索する

続行するには何かキーを押してください . . .

特徴 

下のような特徴があります。

  • コマンド実行前にファイルの存在チェック機能あり (/nオプションで無効化可能)
  • 存在しないファイルが指定された場合は実行スキップ
  • 指定ファイルの中身の各行を実行コマンドの引数として渡すモードもあり (/fオプション)
  • コマンド実行毎にユーザに確認する対話モードあり (/iオプション)

気に入らないとこは各自直して使ってねと。

実行例1 カレントディレクトリ以下のファイルを探して引数で渡す

*.txtにマッチするファイルをカレントディレクトリ、サブディレクトリから探してechoで表示する例です。
実行コマンドにオプションを指定する場合や、実行コマンドパス自体にスペースが含まれる場合は""で囲って下さい。

C:\path\to>iter.bat "echo" *.txt /r
C:\path\to\a.txt
C:\path\to\b.txt
C:\path\to\dir\c.txt

実行例2 ファイルの中身の各行を引数で渡す

a.txtに記載されたファイルの中身をtypeコマンドで表示する例です。
デフォルトでは存在しないd.txtは無視します。
/nオプションでファイルの存在チェックは省略出来ます。
ファイルパス以外を引数として使う場合にご利用下さいまし。

C:\path\to>type a.txt
C:\path\to\a.txt
C:\path\to\b.txt
C:\path\to\dir\c.txt
C:\path\to\dir\d.txt  ←存在しないファイル

C:\path\to>iter.bat type a.txt /f
C:\path\to\a.txt
C:\path\to\b.txt
C:\path\to\dir\c.txt
C:\path\to\dir\d.txt
this is b.txt line1
this is c.txt line1
this is c.txt line2

実行例3 対話的にユーザに確認しながら実行

指定コマンド実行する度に、ユーザに実行可否をyかnで選んでもらいながら実行します。
空のEnterもnと見なして実行しません。(1文字目にyかY指定時のみ実行)

C:\path\to>iter.bat type *.txt /r /i

#-------------------------------------------------
# 対象: C:\path\to\a.txt
> 実行しますか?(y or n + Enter):y
C:\path\to\a.txt
C:\path\to\b.txt
C:\path\to\dir\c.txt

#-------------------------------------------------
# 対象: C:\path\to\b.txt
> 実行しますか?(y or n + Enter):

#-------------------------------------------------
# 対象: C:\path\to\dir\c.txt
> 実行しますか?(y or n + Enter):n

ソース

下のソースを好きな名前で保存して使って下さいな。
今回はソースの解説なしです。
コメント多めにつけたので中身が気になる人は読んでねと。

2017.10.11追記

 ちょっとソースが長いのでgistにしました。
 新しいイテレータを追加したい場合は、34行目で定義しているIterCmdにコマンドを設定する処理を追加して下さい。
 44行目あたりを参考にして頂ければと思います。
 IterCmdには83行目でiter.batの第2引数以降が渡されます。(オプション引数は除く)
 IterCmdの実行結果が1行ずつforループでiter.batの第1引数のコマンドに渡されて実行するようになっています。


gist.github.com

参考

まとめ

このbatファイルの実際の使い方としては、具体的な外部コマンドを指定したラッパーのbatファイルを作って利用することになるのかなと思います。
それをsendtoフォルダなんかに置いていれば「右クリック→送る」から実行出来て少し幸せになれるかもです。

ひとまずノウハウはこのbatファイルに詰め込んだので、明日からキレイサッパリbatファイルのことは忘れることができそうです。

batファイルから解放されてめでたしめでたし。

おしまい。