以编程方式编写批处理文件以回显到 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
命令之间没有意义;我将其保存在 md
和 cd
以避免回显,以防由于某种原因无法创建目录;
作为我正在进行的一些集成测试的一部分,我需要编写一个批处理文件,在 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
命令之间没有意义;我将其保存在md
和cd
以避免回显,以防由于某种原因无法创建目录;