バッチファイルで行末が数字の行をファイル出力する方法
公開日
Windowsのバッチファイル(拡張子bat)は書式に癖があるためか、簡単にできそうなことであっても、やりたいことが普通から外れてしまうと、難易度が上がりちょっとしたコツが必要になります。
今回、ほんのちょっとしたことだったのですが、タイトルにある「行末に数字がある行をファイル出力する方法」が意外とよい情報に行き着かず大変だったので記事にまとめたいと思います。
バッチファイルで文字列のファイル出力
まずバッチファイルでやりたかったことですが、とある文字列のファイル出力をやりたいと思います。
この場合、シンプルに次の例0のように記述することでできます。
1 |
C:\> echo test>file0.txt |
この例0の場合では、file0.txtというファイル名のテキストファイルに文字列testが出力されます。
file0.txtにはこのように出力されるはずです。
1 2 |
C:\> type file0.txt test |
注意点としては、行末に空白を入れると空白も出力されるので、testの後は続けて>(閉じ中括弧記号)を書くところです。
問題点
それでは次の例1,2ではどうなるでしょうか?
1 2 |
C:\> echo test=1>file1.txt C:\> echo test=2>file2.txt |
実行結果はこのようになります。
1 2 3 4 5 6 7 8 9 |
C:\>echo test=1>file1.txt C:\>type file1.txt test= C:\>echo test=2>file2.txt test= C:\>type file2.txt |
残念ながら、期待する動きではありません。
それぞれ原因を整理したいと思います。
原因について
例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ではエラーがなかったことを意味します。
末尾の数字をファイルに出力する方法
この問題の対策として、バッチファイル独特の書式で特殊記号をそのまま出力する方法を使います。
やりかたは次のように特殊記号の直前に^(キャレット記号)をつけます。
1 |
C:\> echo test=^1>file3.txt |
実行結果はこのように期待通りです。
1 2 |
C:\>type file3.txt test=1 |
まとめ
いかがだったでしょうか。
まさか^記号のお世話になるとはこれまで考えもしなかったので個人的に発見でした。
まず記号の読み方がわからなかった・・・。
そしてそういう使い方なのだということがわからないため、やりたいことに行き着くまで、ものすごく検索に手間取ってしまいました。
しかも、この落とし穴はちょいちょい陥りやすそうな気配がしています。
ということで忘れないようにすべきと記事にまとめました。
レスポンシブ広告
関連記事
-
フリーソフトを使わず超シンプルにコマンドラインでZIP形式のファイル圧縮
Windowsでは、フリーソフトを追加することなくエクスプローラから右クリックメ …