PowerShell -启动进程和命令行开关

x9ybnkn6  于 2023-05-17  发布在  Shell
关注(0)|答案(6)|浏览(225)

我可以运行这个很好:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait

但是当我运行下面的代码时,我得到一个错误:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

有没有一种方法可以使用start-process将参数传递给MSBuild?我可以不使用start-process,我使用它的唯一原因是我需要将“command”作为变量。
当我有
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe/v:q /nologo
在一行中,它是如何在PowerShell中处理的?
我应该使用某种eval()函数来代替吗?

xxe27gdn

xxe27gdn1#

你需要把你的参数分成单独的形参

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments
vfhzx4xs

vfhzx4xs2#

使用显式参数,它将是:

$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'

编辑:报价。

xtfmy6hx

xtfmy6hx3#

警告
如果从PowerShell创建的cmd.exe窗口运行PowerShell,则第二个示例不再等待作业完成。

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait

现在,从新cmd窗口,再次运行PowerShell,并在其中启动第二个cmd窗口:cmd2> PowerShell

PS> Start-Process cmd.exe -Wait
PS>

PowerShell的第二个示例不再执行-Wait请求,所有后台进程/作业返回“已完成”状态,即使它们仍在运行!
当我的C#资源管理器程序用于打开cmd.exe窗口并从该窗口运行PS时,我发现了这一点,它也忽略了-Wait请求。似乎任何PowerShell(作为cmd.exe的“win32作业”)都无法荣誉等待请求。
我在Windows 7/x64上使用PowerShell 3.0版本时遇到了这个问题

dfddblmv

dfddblmv4#

我发现使用cmd作为一种替代方案效果很好,特别是当你需要从调用的应用程序中管道输出时(特别是当它没有内置日志记录时,不像msbuild)
cmd /C "$msbuild $args" >> $outputfile

ulydmbyx

ulydmbyx5#

除非OP正在使用PowerShell社区扩展,该扩展确实提供了Start-Process cmdlet沿着一系列其他cmdlet。如果是这种情况,那么Glennular的解决方案就很有效,因为它匹配pscx\start-process的位置参数:- 路径(位置1)-参数(位置2)。

e3bfsja2

e3bfsja26#

如果你想让它等待,在start-processs语句中添加-wait标志。

# Start EXE as a detected process
function StartExe {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true, Position=0)]
        [string]$ProcessName,

        [Parameter(Mandatory=$false, Position=1, ValueFromRemainingArguments=$true)]
        [string[]]$Arguments
    )

    # Command line as Multiple Arguments:
    #    PS> StartExe tclsh myscript.tcl arg1 arg2 arg3
    if ($Arguments) {
        $argumentString = $Arguments -join ' '
        Start-Process -FilePath $ProcessName -ArgumentList $argumentString -NoNewWindow
    }
    
    # Command line as a Single Argument:
    #    PS> StartExe "tclsh myscript.tcl arg1 arg2 arg3"
    else {
        Start-Process -FilePath 'cmd.exe' -ArgumentList "/c $ProcessName" -NoNewWindow
    }
}

相关问题