運行該批處理文件如何使用批處理文件中的if-clause中的括號來轉義變量?
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a%
)
給inside was unexpected at this time.
錯誤。
如何轉義a
變量以避免此錯誤?
運行該批處理文件如何使用批處理文件中的if-clause中的括號來轉義變量?
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a%
)
給inside was unexpected at this time.
錯誤。
如何轉義a
變量以避免此錯誤?
您可以使用兩種不同的方式
使用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:"=%"
使用延遲擴展將修復:
@echo off
setlocal enabledelayedexpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=!a!
)
沒有延遲擴展如果塊(從if
到結束)
,%A%先被替換,然後將塊進行解析,並運行具有延遲。擴展!a!在塊解析後不擴展,所以解析邏輯將不會在a
中看到),並且不會引起問題。
那麼,你修改了** local **'PATH'變量。你如何將這個值轉移到全球範圍? –
在我的答案是一個示例將變量傳輸到全局範圍 – jeb
)
在%a%
是這裏的問題。你可以做一些替代以逃脫)
。
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a:)=^)%
)
我可以結合使用'setlocal EnableDelayedExpansion'並使用'!'而不是'%'來懶惰評估變量的值嗎?當我嘗試時,我得到了')!在這個時候意外。「錯誤。 –
你可以合併它,但它不是必要的,因爲延遲擴展對任何特殊字符都是安全的,也''' – jeb
我會使用延遲擴展或我的方法,而不是兩個。只是一個意見。 –
'set「var = content」' - 誰能猜到? :) –
*在這種情況下,擴展集合語法不是必需的*你能解釋一下嗎? –
我更喜歡它,因爲它避免了行結束處的隱藏空間問題 – jeb