5

我有以下脚本:

$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

5 回答 5

5

我正在使用 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 参数:

$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
于 2015-09-22T16:06:48.140 回答
2

我有同样的问题devenv.exe用来编译这样

Start-Process $devenv $args -Wait

那将需要永远。我将代码重新格式化为此

$proc = Start-Process $devenv $args -PassThru 
$proc.WaitForExit()

它在飞。在我的情况下,它是在循环中编译多个解决方案(40+),在 perf-mon 中我看不到很多活动的 MSBuild/Devenv 进程。每个都很少,但都是“终止”的。而且内存还可以。所以,不错的选择。

于 2020-01-06T23:59:00.577 回答
1

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

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

请务必转义 PowerShell 通常会解释的字符,例如,;

于 2013-11-11T15:31:27.873 回答
0

刚刚观察脚本,发现脚本的第一行好像少了一个单引号。请重试缺少的报价并报告是否有帮助?

于 2013-11-11T12:39:32.453 回答
-1

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

于 2014-06-19T08:46:55.290 回答