运行这个批处理文件
@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"
)
)
在这种情况下,扩展的 set-syntax 不是必需的,我使用它只是为了避免行尾出现隐藏空格。
编辑: 我可以将它与 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?
EDIT2:路径有更多问题(包含引号)
根据这个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"
现在至少有一个括号不在引号内并且能够中断命令 block 。
但是您可以简单地从路径变量中删除所有引号,如前所述,此处不需要引号。
set "newPath=%path:"=%"
关于windows - 如何在批处理文件中使用 if 子句内的括号转义变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883169/