【问题标题】:Execute batch file in Powershell在 Powershell 中执行批处理文件
【发布时间】:2015-12-22 13:39:22
【问题描述】:

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

"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命令之后从批处理中删除我的行并且它都“像它应该那样”执行?

【问题讨论】:

    标签: powershell batch-file


    【解决方案1】:

    除非您的批处理文件位于 %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)中不再适用,其中 @ 987654332@ 现在是默认值 - 请参阅 about_PowerShell.exeabout_pwsh


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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-28
        • 2023-03-30
        • 2011-09-05
        • 1970-01-01
        • 2011-08-27
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多