Использование MSBuild из PowerShell возвращает ошибку VCBuild не загружен

Я пытаюсь запустить сборку на нескольких решениях Visual Studio 2005 из скрипта PowerShell, и она возвращает эту ошибку:

MSBUILD: ошибка MSB3428: не удалось загрузить компонент Visual C++ "VCBuild.exe". Чтобы это исправить, 1) установите.NET Framework 2.0 SDK, 2) установите Microsoft Visual Studio 2005 или 3) добавьте расположение
 компонента в системный путь, если он установлен в другом месте.  [C:\ путь \ к \ решения \solutionToBuild.sln]
Готово Создание проекта "C:\path\to\solution\solutionToBuild.sln" (цели по умолчанию) - СБОЙ.

Сборка не удалась.

"C:\path\to\solution\solutionToBuild.sln" (цель по умолчанию) (1) ->
(targetToBuild target) -> 
  MSBUILD: ошибка MSB3428: не удалось загрузить компонент Visual C++ "VCBuild.exe". Чтобы это исправить, 1) установите.NET Framework 2.0 SDK, 2) установите Microsoft Visual Studio 2005 или 3) добавьте расположение
компонента на системный путь, если он установлен в другом месте.  [C:\ путь \ к \ решения \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 Communication Foundation 3.0.4506.5420                 
Windows Presentation Foundation  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                       

Возможно, мне нужно что-то добавить в путь к системной среде, но в сообщении об ошибке не сказано, что добавить, поэтому я немного растерялся.

1 ответ

Решение

В итоге я полностью изменил написанную мной функцию, и вот что я придумал (что сработало для меня):

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.

Не стесняйтесь, дайте мне знать, если у вас есть предложения по улучшению кода!

Спасибо, Дэвид Даугерти и @stijn!

Другие вопросы по тегам