パス表記のダブルクォーテーション問題は、BATファイル内で解決しよう。

やあ子供たち。物理ベースドレンダリングなんかに夢中になってる場合じゃないぞ、今はその時間AIの勉強に使った方が自分への投資になるぞ。なんて思ってるのはおじさんだけかも知れないが。。(どっちに行ってもNVIDIAなのでどっちでもいいという噂もあるが)さて本題に入ろう。
Windowsでは、パスの中にスペースがある場合などに対応するために、パス表記全体を、ダブルクォーテーションで囲むということをしますが、そうやって環境変数などに定義された、パス文字列を、いざプログラムに読み込む際には、さてこのパス文字列が、ダブルクォーテーションつきなのか否かを判断して、前者の場合には、文字列の最初と最後に現れるこのダブルクォーテーション記号を切り落としてやる必要があります。そこで登場するのが、まさかのWin32API、「PathUnquoteSpacesA()」だ。

// image_pathを取得
const char* image_path = getenv(image_env);
// image_pathの両端にあるダブルクォーテーションを削除。
// (image_pathの内容が更新される)
PathUnquoteSpacesA(image_path);

しかし、こんなものを導入しなくてもいい話があるのだ。それは、もうBATファイルの中の時点で、ダブルクォーテーションを予め取っ払ってやればよい。BATファイルの中で、置換構文を使えばよい。

set XX=%X:"=%

そう、つまりこれは、文字列Xの中の、ダブルクォーテーションを全て削除した文字列をXXに返すというものだ。具体的には以下のような使い方だ。

@echo off

set A="patty cake"
set B=patty cake
set C="bakers""" m""an"
set D="bake me a cake as fast as you can"

set X=%A% %B% %C% %D%
set XX=%X:"=%

echo %XX%
pause

上記を単独の、a.batとでもして、実行してみれば結果は以下のようになる。

patty cake patty cake bakers man bake me a cake as fast as you can

冒頭のWin32APIは、文字列の両端にあるダブルクォーテーションしか削除してくれないのだろうか。そんなことは確認してないが、もうそんなことはどっちでもよくて、このダブルクォーテーションの文化は煩わしいので、極力BAT側で、問題をとっぱらってしまい、あとはダブルクォーテーションなんて想定してないプログラムに流し込むだけ、つまり上記の例でいえば、%XX%を、そのプログラムの引数にして呼び出すようにすればおしまいだ、こうして楽をしよう、この厄介なダブルクォーテーション問題をこのようにして乗り切ってやろうという趣旨の記事でした。
EXEは変えられないけどBATファイルなら末端でいくらでも編集できるからね。今日はこんなところで。チャオ!