以编程方式编写批处理文件以回显到 stderr

Programmatically writing a batch file to echo to stderr

作为我正在进行的一些集成测试的一部分,我需要编写一个批处理文件,在 windows 框上回显到 stderr。目前我正在使用以下命令:

md %UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\ && cd %UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\ && ( echo @echo off  && echo 'echo This is error line 1 1>&2' && echo 'echo This is error line 2 1>&2' && echo @echo on ) >>test-stderrout.bat

这应该在 %UserProfile%\tests\ 目录下创建一个临时目录。然后导航到这个临时工作目录。然后使用以下代码创建一个批处理文件:

@echo off
echo This is error line 1 1>&2
echo This is error line 2 1>&2
@echo on

但是,该文件包含:

@echo off
@echo on

我看到第一个 echo 通过管道输出到 stderr,而不是将其作为文本读取然后放入批处理文件中。是否有可能以某种方式转义以允许输出包含重定向语句?

我假设 windows shell 或多或少像 *nix shells.

md %UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\ && cd %UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\ && echo @echo off >>test-stderrout.bat && echo 'echo This is error line 1 1>&2' >>test-stderrout.bat  && echo 'echo This is error line 2 1>&2'>>test-stderrout.bat  && echo @echo on >>test-stderrout.bat

您正在创建一个子shell 并在其中执行操作,而不是执行您想要的操作,将每个命令回显到 test-stderrout.bat 文件。

我对 windows shell 不是很肯定,但在我看来这就像发生了什么,所以只要你转储 () 并回显字符串到文件,它应该一切正常。可能更优雅的方式来做到这一点,但我认为这会奏效。

或者您可以遵循更好的字符串实践,始终将 echo 放入“..”,这是我在 shell 脚本中经常做的以避免错误的做法。

md %UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\ && cd %UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\ && echo '@echo off' >>test-stderrout.bat && echo 'echo This is error line 1 1>&2' >>test-stderrout.bat  && echo 'echo This is error line 2 1>&2'>>test-stderrout.bat  && echo '@echo on' >>test-stderrout.bat

试试这个:

md c:\e3f949d1219d4cad9288bf88d0fcc906\ & cd C:\e3f949d1219d4cad9288bf88d0fcc906 & echo @echo off >> test-stderrout.bat & echo echo This is error line 1 1^>^&2 >> test-stderrout.bat & echo echo This is error line 2 1^>^&2 >> test-stderrout.bat & echo @echo on >> test-stderrout.bat

在本地测试它似乎可以正常工作。

秘诀是在回显中用 ^ 转义 >& 字符。

下面这行应该做你想做的:

md "%UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\" && cd /D "%UserProfile%\tests\e3f949d1219d4cad9288bf88d0fcc906\" && ((echo @echo off) & (echo echo This is error line 1 1^>^&2) & (echo echo This is error line 2 1^>^&2) & (echo @echo on)) >> test-stderrout.bat

代码更改:

  • 目录路径包含在 "" 中以避免出现空格问题;
  • 开关 /D 添加到 cd 以在必要时更改驱动器(我不知道您当前的驱动器);
  • 你的 echo 行中的 >&^>^& 一样被转义以逐字回显;
  • 每个 echo 命令都包含在 () 中以避免尾随空格;
  • &&(条件命令分隔符)被&(无条件命令分隔符)代替,因为&&echo命令之间没有意义;我将其保存在 mdcd 以避免回显,以防由于某种原因无法创建目录;