2013-02-25 84 views
3

我已閱讀了不同方法獲取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並不是事先知道的 - 在運行腳本之前它們會被另一個程序替代,所以上面的腳本顯示了在替換完成後變量01和變量02的一組示例值。

我得到當此腳本運行錯誤是:

\SomeProgram\Subfolder' was unexpected at this time. 

...這對應於上述腳本中的最後「設置」行。我認爲這個錯誤是由於variable01的括號中的。

如果我把上面一行是:

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

...然後我得到這個錯誤:

Files was unexpected at this time. 

...這似乎表明,它試圖來標記的變量01中的空格,解析器仍然不滿意。

如果我再在腳本的頂部添加這一行:

setlocal enableextensions enableDelayedExpansion 

...並更改%variable01%至variable01!我仍然得到同樣的錯誤。

很顯然,我不明白是什麼批處理文件分析器需要滿足我的要求,即variable03的值具有以下值:

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

...有什麼建議?

回答

2

問題是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 
+1

感謝您的答覆 - 這仍然會產生同樣的錯誤,這可能是因爲variable01還是會被在else子句的背景下展開。我想另一個選擇是修改子程序,使其不需要參數,併爲變量01和變量02的每個組合創建一個不同的子程序... – Hoobajoob 2013-02-25 21:18:35

+0

Are you sure?我在你的問題中得到錯誤代碼,但我沒有用我的代碼得到它。我只是將上述內容複製粘貼到我的記事本中,並試圖確保我沒有錯別字。 – 2013-02-25 21:21:17

+0

請注意'call:set3'行中的*雙引號*。如果你使用單引號,你會得到錯誤。 – 2013-02-25 21:23:44

7

正如Nate寫的,這裏的問題是括號,但是完整的代碼仍然不穩定。

使用延遲擴展總是更好,因爲這對任何特殊字符都是安全的。
你應該使用SETset "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! 
+0

「您應該使用SET set」variable = content「的擴展語法來將完整的表達式用引號括起來,然後它幾乎是安全的......」,爲什麼它幾乎是安全的?在什麼情況下會失敗? – Samuel 2015-02-13 22:57:36

+1

@Samuel當內容包含引號本身時可能是不安全的,比如'set「var =她說:」Dog&Cat「給我」'但是在這種情況下,只有一條路徑它應該是安全的 – jeb 2015-02-14 00:27:38

+0

Gotcha,謝謝澄清。 – Samuel 2015-02-17 16:39:33