作为我正在进行的一些集成测试的一部分,我需要编写一个批处理文件,回显到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,而不是将其作为文本读取,然后在批处理文件中。有可能以某种方式逃避这个以允许输出包含重定向语句吗?
答案 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
命令之间没有意义;我将其保留在md
和cd
,以避免因为某些原因无法创建目录而回显;