1. ホーム
  2. scripting

[解決済み] バッチスクリプトでの二重引用符のエスケープ

2022-12-15 10:14:03

質問

バッチファイルのパラメータの二重引用符をすべてエスケープされた二重引用符に置き換えるには、どうしたらよいでしょうか。これは私の現在のバッチ ファイルで、そのコマンド ライン パラメータをすべて文字列の中に展開します。

@echo off
call bash --verbose -c "g++-linux-4.1 %*"

そして、この文字列を使って、Cygwinのbashを呼び出し、Linuxのクロスコンパイラを実行するのです。残念ながら、私のバッチ ファイルに渡されるパラメーターはこのようなものです。

"launch-linux-g++.bat" -ftemplate-depth-128 -O3 -finline-functions 
-Wno-inline -Wall  -DNDEBUG   -c 
-o "C:\Users\Me\Documents\Testing\SparseLib\bin\Win32\LinuxRelease\hello.o" 
"c:\Users\Me\Documents\Testing\SparseLib\SparseLib\hello.cpp"

ここで、最初に渡されたパスの周りの最初の引用符は、GCCに渡される文字列を早々に終了させ、残りのパラメータを直接bashに渡しています(これは見事に失敗しています)。

私は、もし私がパラメータを単一の文字列に連結し、引用符をエスケープすることができれば、うまくいくはずだと想像していますが、私は、これを行う方法を決定するのに苦労しています。誰か知っていますか?

どのように解決するのですか?

結局、Googleが答えを出してくれました。バッチでの文字列置換の構文はこうです。

set v_myvar=replace me
set v_myvar=%v_myvar:ace=icate%

これは、"replicate me"を生成します。私のスクリプトは今このようになります。

@echo off
set v_params=%*
set v_params=%v_params:"=\"%
call bash -c "g++-linux-4.1 %v_params%"

のすべてのインスタンスを置き換えます。 "\" で、bash用に適切にエスケープされています。