【问题标题】:Batch: Escaping with caret批处理:用插入符号转义
【发布时间】:2012-06-25 16:52:54
【问题描述】:

我一直讨厌批处理,现在我仍然讨厌批处理,即使对于最简单的事情我更喜欢 C 或 PHP/Perl。但这一次我不能没有它,****sigh****。

我想将一个 echo 命令重定向到另一个命令。例如:

echo example | more

但我也希望能够在管道的回显部分使用特殊字符:

echo & | more

这当然行不通。所以我尝试了:

echo ^& | more

这也不起作用。然后通过反复试验我发现:

echo ^^^& | more

这很奏效。但作为感兴趣的程序员,我想知道为什么。为什么^& 不起作用而^^^& 起作用?

【问题讨论】:

标签: batch-file cmd piping


【解决方案1】:

原因与 Windows 如何实现管道有关 - 管道的每一侧都在其自己的 CMD shell 中执行。您的命令 echo ^& | more 实际上会尝试执行

C:\Windows\system32\cmd.exe /S /D /c" echo & "

在左边和

C:\Windows\system32\cmd.exe /S /D /c" more "

在右边。您可以看到左侧失败的原因 - 尝试回显未转义的 &。在执行实际左侧之前,初始解析阶段已消耗了转义。

您的解决方案为何有效也很容易理解。 echo ^^^& | more的左边变成了

C:\Windows\system32\cmd.exe /S /D /c" echo ^& "

在使用 Windows 管道时有许多微妙的复杂性。请参阅Why does delayed expansion fail when inside a piped block of code? 了解更多信息。所选答案具有最佳信息,但我建议阅读问题和所有答案以了解所选答案的上下文。

【讨论】:

  • 非常感谢您的有用回答!
【解决方案2】:

第一个^ 正在转义^ 字符本身(第二个^),第三个^ 正在转义&

当您运行类似ECHO ^& | MORE 的命令时,shell 会将^& 替换为&,然后将输出通过管道传输到MORE

因此,当您运行ECHO ^^^& | MORE 时,shell 将^^ 替换为^,将^& 替换为&,然后将输出通过管道传输到MORE

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多