読書とプログラミングを中心とした覚書ブログ

読書とプログラミングについて、日々経験したことを忘れないようにするため、極力ブログに記録を残すように頑張る。

バッチファイルで行末が数字の行をファイル出力する方法

 公開日   

 

paradise-697151-2

Windowsのバッチファイル(拡張子bat)は書式に癖があるためか、簡単にできそうなことであっても、やりたいことが普通から外れてしまうと、難易度が上がりちょっとしたコツが必要になります。

今回、ほんのちょっとしたことだったのですが、タイトルにある「行末に数字がある行をファイル出力する方法」が意外とよい情報に行き着かず大変だったので記事にまとめたいと思います。

バッチファイルで文字列のファイル出力

まずバッチファイルでやりたかったことですが、とある文字列のファイル出力をやりたいと思います。
この場合、シンプルに次の例0のように記述することでできます。

この例0の場合では、file0.txtというファイル名のテキストファイルに文字列testが出力されます。
file0.txtにはこのように出力されるはずです。

注意点としては、行末に空白を入れると空白も出力されるので、testの後は続けて>(閉じ中括弧記号)を書くところです。

問題点

それでは次の例1,2ではどうなるでしょうか?

実行結果はこのようになります。

残念ながら、期待する動きではありません。
それぞれ原因を整理したいと思います。

原因について

例1,2いずれも原因は同じで、バッチファイルのリダイレクト機能の書式と勘違いされ誤動作してます。
例1では標準出力として、例2では標準エラー出力として、それぞれ解釈されてしまってます。

標準出力のリダイレクト

バッチファイルで「1>」と書くと標準出力のリダイレクトと解釈されます。
これは1を省略した「>」と同じでコマンドが出力した文字列の出力先を右側に書いたファイルに設定するというもの。
例1だとechoコマンドが出力した「test=」という文字列がfile1.txtファイルへ出力されました。

本当は「test=1」と出力したかったのにもかかわらず末尾の1が欠けてしまったという問題点です。

標準エラーのリダイレクト

バッチファイルで「2>」と書くと標準エラーのリダイレクトと解釈されます。
標準エラーとは、コマンド実行時にエラーとして出力した文字列を指します。
例2では例1よりもトリッキーなことがおきており、次の問題が一度に起きてます。

  • 2がリダイレクトと勘違いされた (標準出力と同様の問題)
  • echoコマンドが出力した「test=」の部分はfile2.txtファイルにリダイレクトされなかった (画面に出た)
  • file2.txtには何も書き込まれなかった

3点目で何も書き込まれなかったということは例2ではエラーがなかったことを意味します。

末尾の数字をファイルに出力する方法

この問題の対策として、バッチファイル独特の書式で特殊記号をそのまま出力する方法を使います。

やりかたは次のように特殊記号の直前に^(キャレット記号)をつけます。

実行結果はこのように期待通りです。

まとめ

いかがだったでしょうか。
まさか^記号のお世話になるとはこれまで考えもしなかったので個人的に発見でした。

まず記号の読み方がわからなかった・・・。
そしてそういう使い方なのだということがわからないため、やりたいことに行き着くまで、ものすごく検索に手間取ってしまいました。

しかも、この落とし穴はちょいちょい陥りやすそうな気配がしています。
ということで忘れないようにすべきと記事にまとめました。

レスポンシブ広告

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

  関連記事

フリーソフトを使わずコマンドラインでZIP形式の圧縮ファイルを作る

Windowsでは、フリーソフトを追加することなくZIP形式の圧縮ファイルを作成 …

バッチファイルで行末が数字の行をファイル出力する方法