为批处理文件转义括号内的括号

Posted

技术标签:

【中文标题】为批处理文件转义括号内的括号【英文标题】:Escaping parentheses within parentheses for batch file 【发布时间】:2012-10-10 04:36:38 【问题描述】:

这就是我想要做的:

(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something (like this)
)|clip

因此将其复制到剪贴板中。我尝试了以下方法:

(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something ^(like this^)
)|clip

但这似乎也影响了我的 WANTED 括号,因为我收到了一个错误。为了测试这一点,我简单地完成了:

(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something ^(like this^)
FFF
)|clip

嘿!这几乎可行,文本一直复制到“this”中的“s”。它不复制最后的括号,或者显然是 F。有什么想法吗?

【问题讨论】:

我不明白这个问题。你收到什么错误?如果我使用@echo for something ^(like this^),它会回显for something (like this) 那条评论本身就很好。转义字符似乎也影响第二个括号,即“)|剪辑”。如果您尝试使用整个代码,您会明白我的意思。我收到 ) 出乎意料。 【参考方案1】:

很明显你需要三个插入符号:-)

(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something (like this^^^)
)|clip

为什么?这有点棘手……

首先解析器解析块并将this^^^)部分转义为this^),括号第一次在这里转义。

但是当您使用管道时,整个块将被转换并传输到新的 cmd.exe 实例。C:\Windows\system32\cmd.exe /S /D /c" ( @ echo This is some code is ... & @ echo for something (like this^) )"

在新实例中,需要再次转义右括号。 就是这样!

有关更多信息,您可以阅读类似的问题SO: why does delayed expansion fail when inside a piped block of code

【讨论】:

哈,我尝试了两克拉,但也没有用,我也没有时间尝试三克拉。另外,我想你想要@echo for something ^(like this^^^) @LittleBobbyTables - 不,你只需要插入右括号 谢谢你,你是最棒的。我希望我能理解它是如何工作的,但无论如何,谢谢你的回答! Srsly,微软。实际的 F.【参考方案2】:

如果您对插入符号计数感到困惑,请记住它始终是2 减 1 的幂。或者,请记住,第一次加 2,第二次加 4,第三次加 8,...

例如,(在 XP 上测试)

(
for /f "tokens=* delims=" %%S in (
'echo X^^^^^^^^^^^^^^^& ^^^^^^^^^^^^^^^| ^^^| find " "'
) do @echo %%S
) | find "X"

当 DOS 解析批处理文件时,首先会正常读取 echo 语句 (1),其次是因为它是管道内部命令(DOS 似乎希望管道中的程序,而内部命令不是程序)(3),第三是因为它在一个“for /f”命令驱动的单词列表中(参见 for /?)(7),第四次出现在这个线程中已经给出的原因(15)。

我个人也可能注意到,我认为仅仅因为 DOS 碰巧忽略了在特定情况下丢失的转义,所以将热字符的正确转义排除在外是一种草率的编码。因此,如果我想在上面的例子中呼应一对圆括号,我会给每 15 个插入符号,即使左括号不需要它。那么任何阅读我的代码的人都不必想知道为什么一个括号被引用而另一个不是。以及如何修改代码修改下的引用。

【讨论】:

【参考方案3】:

三重插入符号并非在所有情况下都有效。采取以下措施:

IF EXIST file.txt (
ECHO ...OK
) ELSE (
ECHO TEST THIS: (SOME WORDING! ^^^)   > file.txt
)

file.txt 的内容是:

TEST THIS: (SOME WORDING! ^)

【讨论】:

是的,但我描述了为什么解决方案需要三个插入符号,因为块是通过管道传输的,因此单个插入符号是不够的【参考方案4】:

当我需要在封装的回声中使用右括号时,我的解决方案是在脚本开头创建一个名为 %endPar% 的变量,如下所示:

@set "endPar=)"
@echo This is some code that is>tmp
@echo Important to echo exactly as-is>>tmp
@echo Even if I use parenthesis>>tmp
@echo for something (like this%endPar%>>tmp
@type tmp|clip
@del tmp

我稍微改了一下,测试了两次。

代码只是将回显输出到一个名为 tmp 的文件,然后您将文件的内容通过管道传输到剪辑,然后您就可以将其粘贴到您想要的任何位置。

【讨论】:

但这不起作用。右括号不见了 @jeb - 你是绝对正确的,它没有工作。傻我。我稍微改了一下,测试了几次。立即尝试。 现在它可以工作了,但它不再回答问题了。如何在括号内转义括号 @jeb 太真实了。在没有管道的情况下,我最初的答案在大多数情况下都可以正常工作,但是一旦涉及管道,就会一直三重胡萝卜。如果我的声誉足够高,我会立即对你的答案投赞成票。

以上是关于为批处理文件转义括号内的括号的主要内容,如果未能解决你的问题,请参考以下文章

文本处理三剑客

如何使用正则表达式删除括号内的文本?

java:方括号的属性文件转义序列

eval函数处理JSON数据需要加括号

使用RegEx通过转义获取用大括号括起来的字符串

js正则 变量中括号