0

我正在尝试从 PowerShell 脚本启动一些 Visual Studio 2005 解决方案的构建,它返回此错误:

MSBUILD:错误 MSB3428:无法加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装 .NET Framework 2.0 SDK,2) 安装 Microsoft Visual Studio 2005 或 3) 添加位置
 如果组件安装在其他位置,则将其复制到系统路径。[C:\path\to\solution\solutionToBuild.sln]
完成构建项目“C:\path\to\solution\solutionToBuild.sln”(默认目标)——失败。

构建失败。

"C:\path\to\solution\solutionToBuild.sln" (默认目标) (1) ->
(解决方案构建目标)->
  MSBUILD:错误 MSB3428:无法加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装 .NET Framework 2.0 SDK,2) 安装 Microsoft Visual Studio 2005 或 3) 添加 locati
如果将组件安装在其他位置,则将其放在系统路径中。[C:\path\to\solution\solutionToBuild.sln]

    0 个警告
    1 个错误

经过时间 00:00:00.84

我真的不知道为什么会返回此消息,因为我安装了 MSVS 2005 并且安装了 .NET V2:

PSChildName 版本发布产品
----------- ------- ------- --------
v2.0.50727 2.0.50727.5420                
v3.0 3.0.30729.5420                
Windows 通信基础 3.0.4506.5420                 
Windows 演示基础 3.0.6920.5011                 
v3.5 3.5.30729.5420                
客户端 4.6.01590 394806 4.6.2  
全 4.6.01590 394806 4.6.2  
客户端 4.0.0.0                       

可能是我需要在我的系统环境路径中添加一些东西,但是错误消息没有说明要添加什么,所以我在这里有点不知所措。

4

1 回答 1

0

所以我最终改变了我完全编写的函数,这就是我想出的(对我有用):

function Build-MSVS2K5Solution {
    param (
        [parameter(mandatory=$true)][validateNotNullOrEmpty()][String] $solutionToBuild,
        [parameter(mandatory=$true)][validateNotNullOrEmpty()][Array] $solutionEnv,
        [parameter(mandatory=$false)][validateNotNullOrEmpty()][Switch] $autoOpenBuildLog = $false
    )

    process {
        $wshell = New-Object -ComObject Wscript.Shell
        $wshell.Popup("Please wait while solutions are being rebuilt.",0,"Building Solution...",0x1)
        cd "C:\"
        if (Test-Path "C:\Windows\Microsoft.NET\Framework\v2.0.50727")
        {
            $msBuild = "C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe"
        }

        $buildArgs = $solutionToBuild + (Get-ChildItem $SolutionToBuild | Where { $_.Name -like "*.sln" }) +" /p:Configuration=Debug /p:Platform=Win32"
        $buildLog = [Environment]::GetFolderPath("Desktop") + "\buildlog.log"

        foreach ($solEnv in $solutionEnv ) {
            $itemPath = "env:" + $solEnv.Substring(0, ($solEnv.ToString().LastIndexOf("=") ) )
            $itemValue = $solEnv.Substring( ($solEnv.ToString().LastIndexOf("=")+1) )
            Set-Item -Path $itemPath -Value $itemValue
        }


        Write-Output "Building $buildArgs..."
        Start-Process -FilePath $msBuild -ArgumentList $buildArgs -RedirectStandardOutput $buildLog

        if ($autoOpenBuildLog) 
        {
            Write-Output "Getting content of : $buildLog"
            Get-Content $buildLog -Tail 1 -Wait
        }
    }
}

$solutionEnv = "envName=envValue", "envName2=envValue2", "etc.=etc."
Build-MSVS2K5Solution -SolutionToBuild "C:\Path\to\solution\" -solutionEnv $solutionEnv -autoOpenBuildLog

它并不完美,但它有效。基本上,我发送解决方案的路径,函数找到解决方案“* .sln”(我知道解决方案目录只包含一个)。它设置在字符串中接收到的环境变量,然后开始构建,如果调用了 $autoOpenBuildLog,则 buildLog 将打印在 powershell 提示符中。

如果您有改进代码的建议,请随时告诉我!

谢谢@David Daugherty 和@stijn!

于 2017-07-20T12:25:02.297 回答