DOSバッチでバッチファイルを読み込んで編集して書き出したかった〜後編〜


エンジニア一年生と「rem削除」の闘い~その2~

前回 エンジニア一年生と「rem削除」の闘い(Qiita内)

前提

(免罪符ともいう)
本稿を書いている私は刺身を好きなだけ食える生活がしたいだけの、2019年8月から黒い画面を触り始めたバチバチの初学者です。
完全ではない情報、詰めの甘い部分、もちろん誤った認識等があれば、申し訳ありません。ご指摘ください。
キツい言葉はやめてください。こころおれる。

前回からの持ち越し

これが鬼門
読み込みと書き出し自体に問題は発生しなかったが、コピー元ファイルで

set LOG="nanyara.log"

等したログファイルが
- %LOG%というお名前で
- カレントディレクトリに
- 完全な状態で
作成されるという現象が発生。


※「完全な状態」... echo %date% %time% start > %LOG% 等して書き出している内容がログとして記載された状態

調べて出てきたのは「構文解析」という言葉だった。
正直今でもわかっていないとは思うが、
バッチの文法をバッチに読ますと「進研ゼ〇で見た!」とばかりに張り切ってしまう
ということではないだろうか。と解釈している。


もうすこし真面目な言葉にすると
1) バッチファイルは自分の理解できる文法を見かけると「解析」してしまう
2) 「解析」は通常「.batのファイルを実行する」と同義である
3) ただし「実行する」時にだけ「解析」が行われるわけではない
4) 「.batで実行できるファイル」が「理解できる文法」である
5) 「.batで実行できるファイル」の「拡張子を変えた.logや.txt」も文法は同じとみなされる
以上より.batで実行できるファイル(現在の拡張子を問わず)を.batに読み込ませると、該当ファイルを実行したのに近い動作が発生する場合があるという風に解釈している。ということです。

バッチでなければならない?

そんなことはない。

ただし、自由にソフトウェアをインストールできる環境ではない。
この件を整理すると下記のようになる。


Windows標準の機能で実装したい

なぜか :基本的にソフトウェアの新規インストールはできないから
- Windows標準の
- コマンドプロンプト(バッチ):もういや
- PowerShell :ざっくり調べた感じ、操作対象としての得意分野はファイル単位というよりはシステム側になりそう
- vbs :ファイルの編集もできるらしい むしろ得意らしい

vbsの勉強をした

感想

  • 戻り値の取得がやたらむつかしい
  • オブジェクトをたくさんつくることになる
  • 文字がいっぱいになる
  • ナレッジがあまりヒットしない

詰みでは?などと思った。

DOSに戻る

vbsでもいろいろやったものの「スマートではない」どころか非常に泥臭いスクリプトしか書けなかったし、結局やりたかったバッチの文法をvbsに読ます方法(具体的にはファイル内全文検索と条件に一致した場合の処理分岐、別ファイルへの書き出し)を見つけられなかったので割と心が折れた。

心が折れるとどうなるか。
やけくそになる。

解決

コピー元にあたるバッチファイルを複製し、全文を""で囲んだ。

めちゃくちゃな力技を行使した。
正直実装する必要に駆られていたわけではなく、むしろどちらかというと「業務に使えればいいなと思った趣味の範囲での追及」のような状況になっていたのでこれでもよかったが、業務に使うにはあまりにもクソコードではないかと思ったので使っていない。

やるにあたって
- 書き出しのセクションで!書き出す文:~5,-1!とするとか、""がある前提で文字列を加工することになる
- そもそも原文に""が含まれている場合(ファイルパス等)、原文の方の""を殺さないで後付けの""を使う 方法を考えている暇があったらほかのことを考えた方がいい
- この時点でやっと気づいたわけですが元ファイルで"%~dp0"とか使っているやつが"C:~~"に展開されている場合もあった(注視していなかったので再現条件が不明)

例の免責

一応動いたはずのテストコードを編集して記載しているものの編集ミス等で動かない可能性もあるコードたちです。致命的な何かが起こっても責任は負えません。
ただしご指摘をいただければありがたく修正します。