我想从批处理文件中执行以下操作:
"C:\OpenCover\tools\OpenCover.Console.exe" -register:user -target:"%VS110COMNTOOLS%..\IDE\mstest.exe" -targetargs:"/testcontainer:\"C:\Develop\bin\Debug\MyUnitTests.dll\" ... "
PAUSE
现在我想将进程的输出记录到一个文件中,我遇到了非常方便的PowerShell用法
powershell "dir | tee output.log"
但这不会将我的批处理文件作为第一个参数(powershell "my.bat | tee output.log"
),因为它不是cmdlet或函数或脚本文件的名称。
我可以更改我的批处理文件,以便显示powershell "OpenCover.Console.exe..."
,但我必须调整所有引号并更改转义字符等等。
有没有办法在powershell中执行批处理文件?或者有一种方法可以在一些powershell命令后从批处理中删除我的行,并且它都会执行"就像它应该"?
答案 0 :(得分:2)
除非您的批处理文件位于%PATH%
的文件夹中,否则PowerShell无法找到 [1] ,因此您必须提供明确的文件路径(无论是相对的还是绝对的)。
例如,如果批处理文件位于当前文件夹中,请运行:
powershell ".\my.bat | tee output.log"
考虑添加-noprofile
来禁止加载配置文件,这通常只在交互式会话中需要。
如果您的批处理文件路径包含嵌入的空格,请将其用单引号括起并添加&
:
powershell "&'.\my script.bat' | tee output.log"
[1]更准确地说,PowerShell - 与cmd.exe
不同 - 按设计不会仅仅通过文件名执行当前文件夹中的脚本(在交互式PowerShell会话中,您将获得该效果的提示。这是一个安全功能,旨在防止意外调用不同的可执行文件。
答案 1 :(得分:0)
除非你有一些没有在OP中说明的目的,否则没有理由同时使用Powershell和批处理脚本。如果您只想从PS执行此操作,则可以创建一个PS脚本来执行批处理文件所执行的所有操作。
为了避免转义问题(或者利用CMD.EXE有点奇怪的转义行为:-),您可以使用PS 3.0中引入的--%
。它记录在about_escape_characters下。