windows - 如何在批处理文件中使用 if 子句内的括号转义变量?

标签 windows command-line batch-file escaping

运行这个批处理文件

@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/

相关文章:

windows - 将批处理脚本或 EXE 设置为 Windows 7 中的默认浏览器

windows - 如何复制目录结构但只包含某些文件(使用 Windows 批处理文件)

javascript - 使用 D3.js 只渲染 topojson map 的一部分

windows - 具有开发人员许可证的旧版 MS 软件?

javascript - 检查 Windows 10 计算机中是否安装了非应用商店应用程序

c++ - Mac 独立 Xcode c++ 命令行项目

c - 理解linux命令的源代码在哪里?

batch-file - SSl Handshake_failure SOAPUI

用于 winRT 的 Python 投影(绑定(bind))?

Perl:打印回行首