2017-07-18 4 views
0
geladen

Ich versuche, ein Build auf ein paar Visual Studio 2005-Lösungen aus einem Powershell-Skript zu starten und es gibt diesen Fehler zurück:Mit MSBuild von Powershell gibt Fehler VCBuild nicht

 
MSBUILD : error MSB3428: Could not load the Visual C++ component "VCBuild.exe". To fix this, 1) install the .NET Framework 2.0 SDK, 2) install Microsoft Visual Studio 2005 or 3) add the location 
of the component to the system path if it is installed elsewhere. [C:\path\to\solution\solutionToBuild.sln] 
Done Building Project "C:\path\to\solution\solutionToBuild.sln" (default targets) -- FAILED. 

Build FAILED. 

"C:\path\to\solution\solutionToBuild.sln" (default target) (1) -> 
(solutionToBuild target) -> 
    MSBUILD : error MSB3428: Could not load the Visual C++ component "VCBuild.exe". To fix this, 1) install the .NET Framework 2.0 SDK, 2) install Microsoft Visual Studio 2005 or 3) add the locati 
on of the component to the system path if it is installed elsewhere. [C:\path\to\solution\solutionToBuild.sln] 

    0 Warning(s) 
    1 Error(s) 

Time Elapsed 00:00:00.84 

Ich habe wirklich keine Ahnung, warum diese Nachricht zurückgegeben wird, da ich MSVS 2005 installiert und ich habe .NET V2 installiert:

 
PSChildName      Version  Release Product 
-----------      -------  ------- ------- 
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     
Client       4.6.01590  394806 4.6.2 
Full        4.6.01590  394806 4.6.2 
Client       4.0.0.0      

Es könnte sein, dass ich etwas zu meiner Systemumgebung Weg aber die Fehlermeldung sagt nicht hinzufügen müssen, was hinzufügen Also bin ich ein bisschen ratlos.

+1

Wenn ich mich richtig erinnere, ist dies der Fehler, den Sie erhalten, wenn Sie die Build-Umgebung der Befehlszeile nicht starten. VS2005 ist ziemlich alt und ich habe das nicht installiert. Die Bat-Datei zum Starten dieser in der Build-Umgebung ist wahrscheinlich unter C: \ Programme (x86) \ Microsoft Visual Studio xx \ CommonX \ Tools \ VsMSBuildCmd.bat natürlich wollen Sie das 'X' mit was auch immer ersetzen Version erscheint für 2005 –

+0

Wahrscheinlich was @DavidDaugherty sagt. Wenn der PATH usw. nicht korrekt eingerichtet ist, können Sie 'msbuild solutionToBuild.sln' wahrscheinlich nicht einfach ausführen. Betrachten Sie z.B. die zweite und dritte Antwort hier: https://stackoverflow.com/questions/2124753/how-can-i-use-powershell-with-the-visual-studio-command-prompt – stijn

Antwort

0

So landete ich die Funktion, die ich vollständig schrieb Ändern und hier ist was ich mit kam (was für mich gearbeitet):

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 

Es ist nicht perfekt, aber es funktioniert. Grundsätzlich sende ich den Weg zur Lösung, die Funktion findet die Lösung "* .sln" (ich weiß, dass die Lösung dirigctory nur eine enthält). Sie setzt die in einer Zeichenfolge empfangenen Umgebungsvariablen und startet dann den Build. Wenn $ autoOpenBuildLog aufgerufen wird, wird buildLog in der Powershell-Eingabeaufforderung gedruckt.

Zögern Sie nicht, lassen Sie mich wissen, wenn Sie Vorschläge zur Verbesserung des Codes haben!

Danke @David Daugherty und @stijn!