5

Windowsバッチファイルパーサーでスペース、括弧、その他の特殊文字を含む変数を適切に処理するためのさまざまなアプローチに関する多数のスレッドを読みましたが、どの推奨事項でも問題を解決できないようです。

これがスクリプトです(回避策を試す前に)。その目標は、variable01とvariable02で見つかった値に基づいてvariable03の値を設定することです。

set variable01="C:\Program Files (x86)\SomeProgram\Subfolder"
set variable02="${macro}"

set variable01=%variable01:"=%
set variable02=%variable02:"=%

set variable03=""

if %variable02:~0,1%==$ (
   if %variable01:~0,1%==$ (
      set variable03=%variable03:"=%
   ) else (
      set variable03=-o '%variable01%'
   )
)

... variable01とvariable02の値は事前にはわかりません。スクリプトを実行する前に別のプログラムで置換されるため、上記のスクリプトは、置換が行われた後のvariable01とvariable02の値のセットの例を示しています。

このスクリプトの実行時に発生するエラーは次のとおりです。

\SomeProgram\Subfolder' was unexpected at this time.

...これは上記のスクリプトの最後の「set」行に対応します。このエラーは、variable01の値の括弧が原因であると想定しました。

その行をこれに変更すると:

set "variable03=-o '%variable01%'"

...次に、このエラーが発生します:

Files was unexpected at this time.

...これは、variable01のスペースをトークン化しようとしていることを示しているようですが、パーサーはまだ満足していません。

次に、スクリプトの先頭に次の行を追加します。

 setlocal enableextensions enableDelayedExpansion

...そして%variable01%を!variable01 !に変更しても、同じエラーが発生します。

明らかに、variable03の値が次の値であるという私の要件を満たすためにバッチファイルパーサーが何を必要とするかを理解していません。

-o 'C:\Program Files (x86)\SomeProgram\Subfolder'

...助言がありますか?

4

2 に答える 2

7

Nate が書いたように、この場合の問題はブラケットですが、完全なコードはまだ不安定です。

これは特殊文字に対して安全であるため、常に遅延展開を使用することをお勧めします。
また、拡張構文を使用しSET set "variable=content"て完全な式を引用符で囲む必要があります。これはほぼ安全であり、引用符はコンテンツに追加されません。
また、後で引用符を削除する必要はありません。

これは、var1 と var2 のすべてのコンテンツで機能するはずです。

setlocal EnableDelayedExpansion
set "variable01=C:\Program Files (x86)\SomeProgram\Subfolder"
set "variable02=${macro}"

set "variable03="

if "!variable02:~0,1!"=="$" (
   if "!variable01:~0,1!"=="$" (
      rem
   ) else (
      set "variable03=-o '!variable01!'"
   )
)
echo(!variable03!
于 2013-02-25T23:05:47.560 に答える
3

問題はvariable01の値の括弧です。条件で展開されているifため、これらの括弧はフロー制御として解釈されています。必ず二重引用符で囲んで修正してください。

set variable01="C:\Program Files (x86)\SomeProgram\Subfolder"
set variable02="${macro}"

set variable01=%variable01:"=%
set variable02=%variable02:"=%

set variable03=""

if "%variable02:~0,1%"=="$" (
   if "%variable01:~0,1%"=="$" (
      set variable03=%variable03:"=%
   ) else (
      call :set3 "%variable01%"
   )
)
goto :eof

REM If it is important to have single quotes instead of double then
REM I found I had to call a subroutine.  Otherwise the set could be
REM left up in the else.
:set3
set variable03=-o '%~1'
goto :eof
于 2013-02-25T20:53:04.500 に答える