在Powershell中执行批处理文件

3
我希望能够从批处理文件中运行以下命令:

"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个回答

5

除非你的批处理文件在%PATH%中的某个文件夹中,否则PowerShell找不到它[1],因此你必须提供明确的文件路径(无论是相对路径还是绝对路径)。

例如,如果批处理文件在当前文件夹中,运行:

powershell -c ".\my.bat | tee output.log"

考虑添加-noprofile以抑制加载配置文件,这通常只在交互式会话中需要。

如果您的批处理文件路径包含空格,请用单引号括起来并在前面加上&

powershell -c "& '.\my script.bat' | tee output.log"

注意:上面我故意添加了-c(简称:-Command)参数名称;虽然powershell.exe - Windows PowerShell -默认使用此参数,但在PowerShell [Core] v6+(其可执行文件名为pwsh)中不再是这样,在那里-File现在是默认值-请参阅about_PowerShell.exeabout_pwsh

[1] 更准确地说,PowerShell - 与cmd.exe不同 - 会按设计不仅仅依据文件名在当前文件夹执行脚本(在交互式PowerShell会话中,您将得到有关此问题的提示),这是一项安全功能,旨在防止意外调用不同于预期的可执行文件。


0

除非您在 OP 中声明了某些目的,否则没有理由同时使用 Powershell 和批处理脚本。如果您想仅从 PS 中执行此操作,则可以创建一个 PS 脚本,执行批处理文件所做的所有操作。

为避免转义问题(或者利用 CMD.EXE 的某些奇怪的转义行为 :-)),您可以使用在 PS 3.0 中引入的 --%。它在 about_escape_characters 下有文档记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接