Cou氏の徒然日記(2022)

ほのぼの日記ブログです。

Windowsバッチファイルでパスにスペースを含むファイルを読みこむ

最近、製品のテスト用のツールなどをよく作ることがあります。

こういうのは本来は担当者に作らせたいところなんですが、どうもWindowsバッチを組んだりした経験がなく、時間がないということで、ガッと私が作ることになったんですが…

 

バッチファイルでファイルを1行ずつ読み込む一般的な処理といえばこんな感じ。

f:id:coublood:20220402152518p:plain

f:id:coublood:20220402154045p:plain

@echo off

for /f %%a in (text,txt) do (
  echo %%a
)

f:id:coublood:20220402152503p:plain

 

for /f 文で読み込む対象のファイルを指定します。

ただ、読み込み対象として指定するファイルパスに空白が含まれていなければ何の問題もないのですが、もしファイルパスに半角スペースが含まれていると…

 

f:id:coublood:20220402152129p:plain

@echo off

@rem 半角スペースを含むのでダブルクォーテーションで囲む set FILE_PATH="C:¥Program Files (x86)¥test¥text.txt" for /f %%a in (%FILE_PATH%) do ( echo %%a )

f:id:coublood:20220402154126p:plain

 

すると、読み込むファイルパスがファイル名ではなく、ただの文字列と判定され、その結果、最初のスペースまでの文字列が読み込まれます。

(デフォルトの区切り文字が半角スペースで設定されるため)

 

これを解決する方法はあるのか・・・?

と調べていると、とあるオプションを使えばよさそうです。

 

■ usebackq

→ バッククォートで囲まれた文字列をコマンドとして実行。

 

実際、バッククォートといえば、上記の目的でよく使います。ただ、上記をオプションとして追加することで、解釈がかなり変わってしまうようです。

 

★ダブルクォートで囲った文字列

  • usebackqなし → 文字列として解釈
  • usebackqあり → ファイル名として解釈

★シングルクォートで囲った文字列

  • usebackqなし → コマンドとして解釈
  • usebackqあり → 文字列として解釈

 

このオプションを使うことで、ダブルクォートで囲ったものをファイル名と解釈冴えるようになるので…、

 

f:id:coublood:20220402154101p:plain

@echo off

set FILE_PATH="C:¥Program Files (x86)¥test¥text.txt

@rem useabackqオプションを指定 for /f "usebackq" %%a in (%FILE_PATH%) do ( echo %%a )

f:id:coublood:20220402154159p:plain

 

これで読み込みができるようになりました。

バッククォートのオプションなのに、ここまで変わるのは知りませんでしたね。

 

まあ、実際これ以外にも回避する方法は実際あって、

バッチファイルのカレントパスに移動してしまえば、相対パスだけの問題になり、半角スペースを気にしなくてもよくなります。

 

f:id:coublood:20220402152544p:plain

@echo off

@rem batchファイルの階層に移動 cd %dp~0 for /f %%a in (text.txt) do ( echo %%a )

 

ただ、ファイル名にスペースが含まれている場合や、バッチファイルからの相対パスに半角スペースを含んだ場所にあるファイルを読み込む場合は、この手段が使えないので、やはり usebackqオプションを使った方法しかなさそうな気がしますね。