49

这就是我想要做的:

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

4 回答 4

59

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

(
@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:为什么在管道代码块内延迟扩展失败

于 2012-10-19T14:52:17.453 回答
6

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

例如,(在 XP 上测试)

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

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

I may also note that personally, I consider it sloppy coding to leave proper escaping of hot characters away just because DOS happens to ignore the missing escaping in that particular case. So if I wanted to echo a literal pair of parentheses in the above example, I would give each 15 carets, even if the opening parenthesis does not need it. Then anyone reading my code does not have to wonder why one parenthesis is quoted and the other is not. And how to modify the quoting under code modification.

于 2017-06-01T19:41:25.753 回答
1

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

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

file.txt 的内容是:

TEST THIS: (SOME WORDING! ^)
于 2013-08-22T23:35:45.173 回答
1

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

于 2015-12-04T03:45:25.313 回答