在批处理文件中,如何在括号内使用括号?

51

这是我想要做的事情:

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

但是这似乎也影响了我想要的括号,因为我收到了一个错误。为了测试这个问题,我只是做了以下操作:

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


2
我不明白问题所在。你收到了什么错误?如果我使用@echo for something ^(like this^),它会回显出for something (like this) - LittleBobbyTables - Au Revoir
2
那个注释本身没问题。转义字符似乎也影响了第二个括号,即 ")|clip" 的括号。如果你尝试使用整个代码,你会明白我的意思。我收到错误信息: 在此时间点上")" 意外。 - user1759622
4个回答

64

显然你需要在那里使用三个脱字符号 :-)

(
@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:为什么延迟扩展在管道代码块内无法正常工作


4
好的,我会尽力进行翻译。以下是需要翻译的内容:Hah, I tried with two carats and it didn't work either, and I didn't get around to trying three carats. Also, I think you want @echo for something ^(like this^^^)。哈哈,我试过两个字符,但也不起作用,而且我没来得及试三个字符。此外,我认为你想要使用@echo for something ^(like this^^^) - LittleBobbyTables - Au Revoir
3
@LittleBobbyTables - 不,你只需要在右括号前面加插入符号(^)即可。 - jeb
谢谢,你是最棒的。我希望我能理解它的工作原理,但无论如何,感谢你的回答! - user1759622
12
认真点,微软。真的是什么鬼。 - DaveRandom

6
如果您对插入符号计数感到困惑,请记住它总是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个脱字符,即使左括号不需要它也是如此。那么,任何阅读我的代码的人都不必想知道为什么一个括号被引用了而另一个没有被引用,并且如何在修改代码时修改引用。


1
三角符号并非在所有情况下都有效。请看以下示例:
IF EXIST file.txt (
ECHO ...OK
) ELSE (
ECHO TEST THIS: (SOME WORDING! ^^^)   > file.txt
)

文件 file.txt 的内容为:
TEST THIS: (SOME WORDING! ^)

2
是的,但我解释了为什么这个解决方案需要三个插入符号,因为该块被管道化,因此单个插入符号不足够。 - jeb

1

当我需要在封装的echo中使用右括号时,我的解决方案是在脚本开头创建一个名为%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

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

这段代码简单地将echo输出到一个名为tmp的文件中,然后您可以将文件内容管道传输到clip,它就可以随时粘贴到您想要的位置了。


1
但它不起作用。缺少闭括号。 - jeb
@jeb - 你说得完全正确,它没有起作用。我太傻了。我稍微改了一下,并测试了几次。现在再试试看。 - Sirach Matthews
1
现在它可以工作了,但它不再回答问题。如何在括号内部转义括号。 - jeb
@jeb 太对了。在大多数情况下,我的原始答案没有管道也可以正常工作,但一旦涉及到管道,就要使用三个尖括号。如果我的声望足够高,我会毫不犹豫地为你的答案点赞。 - Sirach Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接