如何使用batch file中的if-clause中的括号来转义variables?

运行这个batch file

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

inside was unexpected at this time. 错误。

如何逃避avariables,以避免这个错误?

Solutions Collecting From Web of "如何使用batch file中的if-clause中的括号来转义variables?"

您可以使用两种不同的方式

使用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:Windows命令解释器(CMD.EXE)如何解析脚本?

编辑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:)=^)% ) 

使用延迟扩展将修复:

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

如果没有延迟扩展if块(从if到结尾) ,%a%被首先替换,然后块被解析并运行。 随着延期扩张! 在解析块之后不扩展。 所以解析逻辑将不会看到),并不会导致它的问题。

括号和变量总是很痛苦的混合。 改用一个子程序。

 @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会话使用。 删除,如果他们不需要。