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

时间:2015-10-06 17:34:21

标签: batch-file 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,而不是将其作为文本读取,然后在批处理文件中。有可能以某种方式逃避这个以允许输出包含重定向语句吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

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

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

秘诀就是在回声中使用>转义&^个字符。

答案 1 :(得分:1)

以下行应该做你想做的事:

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,以避免因为某些原因无法创建目录而回显;