Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.287 Beiträge
 
Delphi 12 Athens
 
#1

MSBuild manuell aus FinalBuilder aufrufen

  Alt Gestern, 11:18
Moin Moin,

ich versuche immernoch aus Powershell (später FinalBuilder) den MSBuild aufzurufen,
aber irgendwie will das einfach nicht. (zwei was auszuführen)

Ja, FinalBuilder hat Delphi- und MSBuild-Actions, aber die sind unbrauchbar.
* einmal braucht man unbedingt jedesmal sofort eine neue Version, wenn neues Delphi raus kommt
* und dann lassen sie sich eh nur via BeforeAction "dynamisch" konfigurieren (und in AfterAction reseten, damit die fbp8 nicht ständig Änderungen im GIT anzeigt)
* also kann man das auch gleich alles selbst im Script machen



Also erstmal in PowerShell ISE rumgespielt.

* rsvars.bat + MSBuild.exe
* oder selbst das Environment zusammenstellen und damit MSBuild starten

* Wenn ich die Variablen aus rsvars lade und 1:1 übergebe, dann werden die enthalten Variablen nicht ersetzt und es heißt "MSBuild not found".
* Mit Replace bleibt aber CMD hängen und läuft in den Timeout. (oder läuft ewig)
* Über SET angesehn, sieht das Environment aber OK aus.

* Aber auch rsvars.bat & MSBuild.exe will nicht.
Hab auch schon alles mögliche bezüglich dem Escaping versucht ... für CMD /C mit oder ohne /S, ist das ja oft bissl verzickt.

Code:
$DelphiDir    = "C:\Program Files (x86)\Embarcadero\Studio\22.0"
$BuildPlatform = "Win32"
$BuildConfig  = "Debug"
$ProjectDir   = "C:\Irgendwo"
$ProjectFile  = "C:\Irgendwo\MyTest.dproj"



## INIT
$PInfo = New-Object System.Diagnostics.ProcessStartInfo
$PInfo.WorkingDirectory      = $ProjectDir
$PInfo.FileName              = "cmd.exe" # oder $Env.ComSpec
#$PInfo.Arguments             = "/s", "/c", "call `"$DelphiDir\bin\rsvars.bat`" `& MSBuild.exe /nologo /target:Build /property:Platform=$BuildPlatform /property:Config=$BuildConfig `"$ProjectFile`""
#$PInfo.Arguments             = "/s", "/c", "call `"$DelphiDir\bin\rsvars.bat`" `& echo MSBuild.exe /nologo /target:Build /property:Platform=$BuildPlatform /property:Config=$BuildConfig `"$ProjectFile`" `& set"
#$PInfo.Arguments             = "/c", "MSBuild.exe /nologo /target:Build /property:Platform=$BuildPlatform /property:Config=$BuildConfig `"$ProjectFile`""
$PInfo.Arguments             = "/c", "set"
$PInfo.RedirectStandardError = $true
$PInfo.RedirectStandardOutput = $true
$PInfo.UseShellExecute       = $false

## LOAD rsvars.bat
if ($true) {  #if ($PInfo.Arguments -NotContains "rsvars") {
  foreach ($Line in (Get-Content "C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\rsvars.bat")) {
    if ($Line.Trim() -ne "") {
      $Key  = $Line.Split('=')[0].TrimStart("@SET").Trim()
      $Value = ($Line.Split('=')[1] + "").Trim()
      foreach ($Match in (Select-String "%([a-z0-9_]+)%" -input $Value -AllMatches).Matches) {
        $Value2 = ($PInfo.EnvironmentVariables[$Match.Value.Trim("%")] + "").Trim()
        #if ( ($Value2 -ne $null) -And ($Value2 -ne "") ) {
          $Value = $Value.Replace($Match.Value, $Value2)
        #}
      }
      Write-Host "set `"$Key`" = `"$Value`""
      $PInfo.EnvironmentVariables[$Key] = $Value
    }
  }
}

## EXECUTE
$Process = New-Object System.Diagnostics.Process
$Process.StartInfo = $pinfo
$Process.Start() | Out-Null
#$Process.WaitForExit()
if ($Process.WaitForExit(10 * 1000) -ne $true) {
  $Process.Kill()
  #throw "TIMEOUT"
  Write-Host "{TIMEOUT}"
}
$StdOut = $Process.StandardOutput.ReadToEnd()
$StdErr = $Process.StandardError.ReadToEnd()

## LOG
Write-Host "ExitCode:", $Process.ExitCode
Write-Host "StdOut:`n$StdOut"
Write-Host "StdErr:`n$StdErr"
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 13:47 Uhr)
  Mit Zitat antworten Zitat