运行此批处理文件
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a%
)
出现错误:内部在此时是意外的
。
如何转义变量a
以避免此错误?
运行此批处理文件
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a%
)
出现错误:内部在此时是意外的
。
如何转义变量a
以避免此错误?
您可以使用两种不同的方法
使用扩展语法的 set
命令,带引号的 set "var=content"
会将 var 设置为 content,
引号包裹 content ,所以特殊字符不会产生问题,并且它使用引号之前的内容作为 content(不包括引号本身)。
@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"
)
)
在这种情况下,扩展的集合语法并不是必需的,我只是使用它来避免在行末隐藏空格。@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:路径中有引号时会出现更多问题
根据这个问题,当路径中包含引号时可能会发生另一个括号的问题。
示例
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:"=%"
%a%
中的 )
。您可以进行一些替换以转义 )
。
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a:)=^)%
)
setlocal EnableDelayedExpansion
结合使用,并使用 !
而不是 %
来延迟计算变量的值?当我尝试时,出现了 )! was unexpected at this time.
错误。 - Piotr Dobrogost)
。 - jeb@echo off
setlocal enabledelayedexpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=!a!
)
如果没有延迟扩展,if块(从if
到结尾的)
)会先替换%a%,然后解析并运行该块。使用延迟扩展后,在块解析后不会扩展!a!。因此,解析逻辑不会看到a
中的)并且不会引起问题。
PATH
变量。你打算如何将这个值传递到全局范围? - Piotr Dobrogost