PowerShell:使用wait选项启动进程需要很长时间才能返回

时间:2013-11-11 11:50:36

标签: powershell msbuild

我有以下脚本:

$mArgs = @('myProj.vcxproj', '/t:Clean,Build' ,('/p:configuration=DEBUG'+';platform=win32;OutDir=./'))
Start-Process msbuild.exe -ArgumentList $mArgs -RedirectStandardOutput $tempFile -wait

以上成功构建了myProj。但是,返回需要很长时间。当达到上面的行时,我看到msbuild窗口大约2分钟。然后,它关闭。之后,该过程需要8分钟才能完成。如果我只是在cmd窗口中运行上面的内容,它需要大约2分钟才能完成。 我尝试启动进程cmd.exe并将msbuild作为参数传递,但得到了相同的结果。 我也尝试过Invoke-Expression,也得到了相同的结果。

有没有人知道导致这种延迟的原因是什么?

提前致谢!

4 个答案:

答案 0 :(得分:4)

我正在使用PowerShell v4.0 Start-Process在Win2012R2上运行MSBuild。通常我的解决方案的构建时间是1分钟,但在构建服务器上它是16分钟。 MSBuild需要15分钟关闭所有节点并最终退出(16分钟打印"完成!!!")。

PowerShell代码:

$process = Start-Process -FilePath $fileName -ArgumentList $arguments
 -WorkingDirectory $workingDir -NoNewWindow -PassThru -Wait
Write-Host "Finished!!!"
$exitCode = $process.ExitCode

MSBuild args:

$commandLine = "/nologo /p:Configuration=Release;Platform=x64 /maxcpucount:2"
 + " "+ $dir + "MySolution.sln"

/ nodeReuse:false 添加到MSBuild命令行后,构建时间恢复正常(1分钟)。

以下是工作代码:

function PsStartProcess([string]$fileName, [array]$arguments, [string]$workingDir)
{
    if (!$workingDir)
    {
        $workingDir = [System.IO.Directory]::GetCurrentDirectory()
    }

    $process = Start-Process -FilePath $fileName -ArgumentList $arguments -WorkingDirectory $workingDir -NoNewWindow -PassThru -Wait
    Write-Host "Finished!!!"
    $exitCode = $process.ExitCode
    $process.Close()

    return $exitCode
}

$exeFileName = "c:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe"
$commandLine = "/nologo /p:Configuration=Release;Platform=x64 /maxcpucount:2 /nodeReuse:false" + " "+ $dir + "MySolution.sln"
PsStartProcess $exeFileName $commandLine $binDir

答案 1 :(得分:1)

为什么使用Start-Process运行MSBUILD?我直接在PowerShell中运行它,例如:

C:\PS> msbuild myproj.vcxproj /t:clean`,build /p:configuration=DEBUG`;platform=win32`;OutDir=. > $tempfile

确保逃避PowerShell通常会解释的字符,例如,;

答案 2 :(得分:0)

刚刚观察了脚本,发现脚本的第一行似乎缺少单引号。如果有帮助,请再次使用缺失的报价并报告?

答案 3 :(得分:-1)

在Windows 7上,该过程在构建完成后立即返回,但在Windows 8上我遇到了同样的问题。如果可能的话,我也会尝试使用其他一些环境进行测试。