2014-10-13 11 views
7

Ich habe ein PowerShell-Skript mit einem switch (boolean) -Parameter, den ich in einem TeamCity-Build-Schritt aufrufen möchte.Wie man einen PowerShell-Switch-Parameter aus der Build-Konfiguration von TeamCity einstellt

Ich möchte, dass der Wert des Schalters (true/false) gemäß einem TeamCity-Build-Parameter, einem Konfigurationsparameter, festgelegt wird.

So etwas wie folgt aus: enter image description here

Und in der Powershell-Läufer Build-Schritt: enter image description here

Aber die oben funktioniert nicht.

ich diesen Fehler

[14:27:01][Step 1/1] Cannot process argument transformation on parameter 'preRelease'. Cannot 
[14:27:01][Step 1/1] convert value "System.String" to type 
[14:27:01][Step 1/1] "System.Management.Automation.SwitchParameter". Boolean parameters accept only 
[14:27:01][Step 1/1] Boolean values and numbers, such as $True, $False, 1 or 0. 

Wie Sie sehen können, scheint es, dass Powershell darauf bestehen, den Parameter als String auf der Interpretation.

Ich habe viele Varianten des Schreibens des Skriptarguments ausprobiert. Keines dieser Arbeit:

-preRelease:%IncludePreRelease% 
-preRelease:([boolean]%IncludePreRelease%) 
-preRelease:([System.Convert]::ToBoolean(%IncludePreRelease%)) 

Antwort

1

Laut der Microsoft .NET-Dokumentation für Convert.ToBoolean der Wert an die Methode übergeben müssen:

Für eine erfolgreiche Umsetzung zu erreichen, muss der Wert Parameter entweder gleich Boolean.TrueString, eine Konstante mit dem Wert True, Boolean.FalseString, eine Konstante mit dem Wert False oder null. Beim Vergleichen des Werts mit Boolean.TrueString und Boolean.FalseString ignoriert die Methode die Groß-/Kleinschreibung sowie den führenden und nachgestellten Leerraum.

Wenn Sie Ihre Teamcity ändern IncludePreRelease Variablenwert entweder auf „Wahre“ oder „Falsch“ (ohne die Anführungszeichen), dann sollte es richtig konvertieren.

5

Dies ist eine alte Frage, aber wenn Sie immer noch nach einer Antwort suchen, habe ich es geschafft, es zum Laufen zu bringen.

Der Haupttrick ist, dass Sie eigentlich nicht den Doppelpunkt zwischen dem Parameternamen und dem Wert verwenden sollten, wie Sie es mit PowerShell tun würden (ich weiß, verwirrend ...).

Es sieht so aus, als ob TeamCity das Skript auf andere Weise aufruft und die Parameter als String übergibt.

So mit Ihrem Beispiel soll folgende Arbeiten: -PRERELEASE $% IncludePreRelease%

Bitte beachten, dass ich ein Dollarzeichen vor dem Teamcity Variable hinzugefügt "true" in "$ true"

zu ändern

Lassen Sie mich wissen, ob es für Sie funktioniert

Vielen Dank!

+0

half mir hinzufügen, zu ändern. Vielen Dank! –

4

Nein, das wird immer noch nicht funktionieren. Es scheint, dass TC den Wert immer als String behandelt, egal was passiert.Vielleicht war die Antwort von einer Version von TC, die dies erlaubte, aber die neueste Version nicht.

ohne Doppelpunkt:

[16:18:37]Step 1/6: Migrate Up (Powershell) 
[16:18:37][Step 1/6] PowerShell Executable: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 
[16:18:37][Step 1/6] PowerShell arguments: [-NonInteractive, -ExecutionPolicy, ByPass, -File, C:\BuildAgent\work\f2797fec10821a01\data\Migration\MigrateUp.ps1, "data\change scripts", DB, xxxxxxx, sa, *******, -NoExec, $false] 
[16:18:37][Step 1/6] C:\BuildAgent\work\f2797fec10821a01\data\Migration\MigrateUp.ps1 : A positional parameter cannot be found that accepts argument '$false'. 

Mit Doppelpunkt:

[16:18:37]Step 2/6: Migrate Up (Powershell) 
[16:18:37][Step 2/6] PowerShell Executable: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 
[16:18:37][Step 2/6] PowerShell arguments: [-NonInteractive, -ExecutionPolicy, ByPass, -File, C:\BuildAgent\work\f2797fec10821a01\data\Migration\MigrateUp.ps1, "data\change scripts", DB, xxxxxx, sa, *******, -NoExec:$false] 
[16:18:37][Step 2/6] C:\BuildAgent\work\f2797fec10821a01\data\Migration\MigrateUp.ps1 : Cannot process argument transformation on parameter 'NoExec'. Cannot convert value "System.String" to type "System.Management.Automation.SwitchParameter". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0. 

die [switch] auch einen beliebigen Wert nicht funktioniert Entfernen Sie geben nicht als Boolesche behandelt werden - sondern eine Zeichenfolge zugewiesen zu einem booleschen - und somit sind alle booleschen Operationen $true.

Mit anderen Worten, alles, was Sie senden wie folgt aussehen:

  • 0 => '0'
  • 1 => '1'
  • $ false => '$ false'
  • $ true => '$ true'

(von denen keine == $false aber alle auf $ true gleichwertig sind)

Ich habe keine Ahnung, wie man TC dazu bringt, Booleans zu akzeptieren! gut ich konnte das Argument eine Zeichenfolge war und verwenden System.Convert.ToBoolean() intern in meinem Skript tun war übernehmen ...

+0

Nur um die Dinge zusammenzufassen: Keine der folgenden Lösungen funktionierte für mich (das Argument -File ist ziemlich gemein), daher musste ich meinen Skript-Parameter-Typ in '[String]' ändern und wie folgt verwenden: ' ' $ ([System.Convert] :: ToBoolean ($ preRelease) ' –

0

Machen Sie den Schalter an allen abhängig von der Konfiguration Parameter übergeben:

  1. Wenn Sie den Konfigurationsparameter erstellen, wählen Sie Typ "Checkbox".
  2. In "Checked Wert", setzen Sie "-preRelease".
  3. Lassen Sie "Ungeprüfter Wert" leer.
  4. Hängen Sie einfach "% IncludePreRelease%" an Ihre Skriptargumente an. Wenn der Parameter aktiviert ist, wird "-preRelease" (= true) übergeben, und wenn dies nicht der Fall ist, wird er weggelassen (= false).

Dies funktionierte für mich mit TeamCity 10.0.4.

0

Ich weiß, dass dies eine späte Antwort ist, aber ich hatte gerade einen Kollegen bei der Arbeit stolperte über das gleiche Problem und fand diese Frage.

Wenn wir über TC für eine Minute vergessen, wenn Sie den gleichen Befehl von einer cmd (nicht powershell Konsole) der genaue Befehl wäre ausführen wollen:

powershell.exe -File script.ps1 -preRelease

Dieser Befehl setzt den Schalter auf Wahr. Wichtig dabei ist, dass der Befehl zuerst von der Shell geparst wird (cmd).

Da die Shell cmd ist, wird Powershell-Code in der Befehlszeile nicht ausgeführt.

Zum Beispiel:

powershell -File script.ps1 -preRelase:"([System.Convert]::ToBoolean(%IncludePreRelease%))"

nach dem ersten Durchlauf der cmd Parsen es endet als:

powershell -File script.ps1 -preRelase:"([System.Convert]::ToBoolean(True))"

so die preRelease Flag auf die gesamte Zeichenfolge festgelegt wird, das verursacht Sie genau

Cannot process argument transformation on parameter 'preRelease'. 
Cannot convert value "System.String" to type 
"System.Management.Automation.SwitchParameter" 

Basierend auf der documentation, wenn Sie -File verwenden, übergeben Sie entweder die Schalterparameter oder nicht. Es scheint keinen Weg zu geben, den True oder False Wert zu übergeben.

Um es zu ändern, wie so -File--Command funktioniert:

powershell -Command .\script.ps1 -preRelease:$%IncludePreRelease%

Nun zurück zu Teamcity. Teamcity scheint -Comand nicht wie oben zu unterstützen. Sie unterstützen es, indem Sie Ihr gesamtes Skript als Skriptblock in die Befehlszeile schreiben, was zu sehr interessanten Fehlern führen kann.

Die Lösung ist die Script-Source und im Skript Inhalt

.\script.ps1 -preRelease:$%env.IncludePreRelease%

Here is my configuration

Verwandte Themen