2014-10-13 13 views
7

Ho uno script PowerShell con un parametro switch (booleano) che desidero chiamare da un passaggio di build di TeamCity.Come impostare un parametro switch PowerShell dalla configurazione build di TeamCity

Voglio che il valore dello switch (true/false) sia impostato in base a un parametro di build di TeamCity, un parametro di configurazione.

Quindi, qualcosa di simile: enter image description here

E nella fase di compilazione corridore PowerShell: enter image description here

ma quanto sopra non funziona.

ottengo questo errore

[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. 

Come si può vedere, sembra che PowerShell insistono sul interpretare il parametro come una stringa.

Ho provato molte varianti di scrivere l'argomento dello script. Nessuno di questi lavori:

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

risposta

1

Secondo la documentazione di Microsoft .Net per Convert.ToBoolean il valore passato al metodo deve essere:

Per una conversione a verificarsi, il parametro di valore deve essere uguale o Boolean.TrueString, una costante il cui valore è True, Boolean.FalseString, una costante il cui valore è False o deve essere null. Confrontando il valore con Boolean.TrueString e Boolean.FalseString, il metodo ignora il caso oltre allo spazio bianco iniziale e allo spazio bianco finale di .

Se si cambia TeamCity IncludePreRelease valore della variabile a uno "Vero" o "False " (senza le virgolette) allora dovrebbe convertire in modo corretto.

5

Questa è una vecchia domanda, ma se si sta ancora cercando una risposta, sono riuscito a farlo funzionare.

Il trucco principale è che non si dovrebbero effettivamente usare i due punti tra il nome del parametro e il valore come faresti con PowerShell (lo so, confuso ...).

Sembra che TeamCity invochi lo script in un modo diverso e passa i parametri come stringa.

Quindi, con il tuo esempio, il seguente dovrebbe funzionare: -preRelease $% IncludePreRelease%

Si noti che ho aggiunto un segno di dollaro davanti alla variabile TeamCity per cambiare "vero" in "$ true"

Fatemi sapere se funziona per voi

Grazie!

+0

mi ha aiutato. Grazie! –

4

No, non funziona ancora. Sembra che TC considererà sempre il valore come una stringa, non importa quale.Forse la risposta era da una versione di TC che consentiva questo, ma l'ultima versione no.

Senza i due punti:

[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'. 

Con due punti:

[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. 

Rimozione del [switch] anche non funziona come qualsiasi valore si dà, non sarà trattato come un valore booleano - ma piuttosto una stringa assegnato a un booleano - e, quindi, tutte le operazioni booleane saranno $true.

In altre parole, tutto ciò che si invia sarà simile:

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

(nessuno dei quali sono == $false ma che sono tutti equivalenti a $ true)

0.123.

Non ho idea di come ottenere TC per accettare booleani! migliore che potevo fare era assumere l'argomento era una stringa e utilizzare System.Convert.ToBoolean() internamente nel mio script ...

+0

Solo per riassumere: nessuna delle soluzioni di seguito ha funzionato per me (l'argomento -File è piuttosto mediocre), quindi ho dovuto modificare il tipo di parametro script in '[String]' e usarlo come segue: '$ ([System.Convert] :: ToBoolean ($ prerelease) ' –

0

Fare passare l'interruttore del tutto dipende dal parametro di configurazione:

  1. Quando crei il parametro di configurazione, scegli "Casella di controllo".
  2. In "Valore selezionato", inserire "-preRelease".
  3. Lascia vuoto "Valore non verificato".
  4. Basta aggiungere "% IncludePreRelease%" agli argomenti dello script. Quando il parametro è selezionato, passerà "-preRelease" (= true) e, quando non lo è, verrà omesso (= false).

Questo ha funzionato per me utilizzando TeamCity 10.0.4.

0

So che questa è una risposta tardiva, ma ho appena avuto un collega al lavoro inciampare sullo stesso problema e ho trovato questa domanda.

Se ci dimentichiamo di TC per un minuto, se si voleva eseguire lo stesso comando da un (non powershell console) cmd il comando esatto sarebbe:

powershell.exe -File script.ps1 -preRelease

Questo comando imposta l'interruttore Vero. Ciò che è importante qui è che il comando viene prima analizzato dalla shell (cmd).

Poiché la shell è cmd, il codice di PowerShell nella riga di comando non verrà eseguito.

Ad esempio:

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

dopo il primo passaggio del cmd parsing finisce per essere:

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

così il flag preRelease viene impostato l'intera stringa che dà sei esattamente

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

In base allo documentation, quando si utilizza -File o si passano i parametri dello switch o no. Non sembra essere un modo per passare il valore True o False.

Per farlo funzionare cambiamento -File--Command in questo modo:

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

Ora, tornando alla TeamCity. Teamcity non sembra supportare -Come come sopra. Lo supportano scaricando l'intero script nella riga di comando come blocco di script che può portare a errori molto interessanti.

La soluzione è quello di cambiare il Script-Source e dentro il contenuto dello script aggiungere

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

Here is my configuration

Problemi correlati