2011-10-19 47 views

回答

27

您可以使用兩種不同的方式

使用set用引號將set "var=content"設定內容VAR的擴展語法, 內容是引述這樣的特殊字符都沒有問題,而且它使用的內容,直到最後一個引號(沒有引號本身)

@echo off 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set "PATH=%a%" 
) 

使用延遲擴展(如shf301的答案),但也值傳送到主範圍。

@echo off 
setlocal enabledelayedexpansion 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set "localScope_PATH=!a!" 
    rem now transfer it to the global scope 
    FOR /F "delims=" %%A in ("!localScope_PATH!") DO (
     endlocal 
     set "path=%%A" 
    ) 
) 

在這種情況下,擴展集合語法不是必需的,我只是爲了避免在行結束處隱藏空格。

編輯: 我可以結合這與SETLOCAL EnableDelayedExpansion和使用!而不是%來懶惰評估變量的價值?當我嘗試我得到)!在這個時候是意外的。

你可以,但它是禁忌的生產,如

@echo off 
Setlocal EnableDelayedExpansion 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=!a:^)=^^^)! 
    set path 
) 

那麼你的路徑包含在)的面前就像 C:\programs (x86^)

插入符號要理解擴展是如何工作的,你可以閱讀SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

編輯2:路徑的更多問題(含引號)
根據此question可以在路徑包含引號時出現括號中的另一個問題。

樣品
path="C:\Program Files (x86)";C:\Program Files (x86)\Skype

這是允許的,即使它沒有必要在這裏使用引號,但是這會破壞擴展SET語法,現在set "newPath=%path%"擴展到

set "newPath="C:\Program Files (x86)";C:\Program Files (x86)\Skype" 

現在至少一個括號不在引號內,並且能夠打破命令塊。

但是,您可以簡單地從路徑變量中刪除所有引號,如上所述,引號在這裏不是必需的。

set "newPath=%path:"=%" 
+0

'set「var = content」' - 誰能猜到? :) –

+0

*在這種情況下,擴展集合語法不是必需的*你能解釋一下嗎? –

+0

我更喜歡它,因爲它避免了行結束處的隱藏空間問題 – jeb

2

使用延遲擴展將修復:

@echo off 
setlocal enabledelayedexpansion 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=!a! 
) 

沒有延遲擴展如果塊(從if到結束),%A%先被替換,然後將塊進行解析,並運行具有延遲。擴展!a!在塊解析後不擴展,所以解析邏輯將不會在a中看到),並且不會引起問題。

+0

那麼,你修改了** local **'PATH'變量。你如何將這個值轉移到全球範圍? –

+0

在我的答案是一個示例將變量傳輸到全局範圍 – jeb

2

括號和變量總是很難混用。改爲使用子例程。

@Echo Off 
Set a=some value with (parentheses) inside 
If 1 == 1 Call :SetPath 
Echo %Path% 
Exit /B 

:SetPath 
Set "Path=%a%" 
SetX "Path" "%a%" 
Exit /B 

我設置變量兩次,一次使用Set當前shell會話,並用一個對SetX設置系統範圍內爲今後的shell會話。如果不需要,可以刪除。

4

)%a%是這裏的問題。你可以做一些替代以逃脫)

@echo off 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=%a:)=^)% 
) 
+0

我可以結合使用'setlocal EnableDelayedExpansion'並使用'!'而不是'%'來懶惰評估變量的值嗎?當我嘗試時,我得到了')!在這個時候意外。「錯誤。 –

+0

你可以合併它,但它不是必要的,因爲延遲擴展對任何特殊字符都是安全的,也''' – jeb

+0

我會使用延遲擴展或我的方法,而不是兩個。只是一個意見。 –

相關問題