在Powershell中执行批处理文件

时间:2015-12-22 13:39:23

标签: powershell batch-file

我想从批处理文件中执行以下操作:

"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命令后从批处理中删除我的行,并且它都会执行"就像它应该"?

2 个答案:

答案 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下。