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

时间:2012-10-19 14:26:09

标签: batch-file parentheses

这就是我想要做的事情:

(
@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的。有什么想法吗?

4 个答案:

答案 0 :(得分:39)

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

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

答案 1 :(得分:2)

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

例如,(在XP上测试)

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

当DOS分析批处理文件(1)时,首先正常读取echo语句,其次是因为它是管道内部命令(DOS似乎想要管道中的程序,而内部命令不是程序)(3),第三,因为它是在/ f'命令驱动的单词列表(参见/?)(7),以及第四次由于该主题(15)中已经给出的原因。

我可能还会注意到,就个人而言,我认为只是因为DOS碰巧忽略了那个特殊情况下的丢失逃逸,所以我们认为这是一种草率的编码。因此,如果我想在上面的例子中回显一对字面的括号,我会给每15个插入符号,即使左括号不需要它。然后,任何阅读我的代码的人都不必怀疑为什么引用一个括号而另一个不引用。以及如何修改代码修改下的引用。

答案 2 :(得分:0)

三重插入符并不适用于所有情况。采取以下措施:

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

file.txt的内容是:

TEST THIS: (SOME WORDING! ^)

答案 3 :(得分:0)

当我需要在封装的回声中使用右括号时,我的解决方案是在我的脚本开头创建一个名为%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的文件,然后将文件的内容传送到剪辑,它就可以随时粘贴到任何你想要的地方。