Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set a PowerShell switch parameter from TeamCity build configuration

I have a PowerShell script with a switch (boolean) parameter that I want to call from a TeamCity build step.

I want the value of the switch (true/false) to be set according to a TeamCity build parameter, a configuration parameter.

So, something like this: enter image description here

And in the PowerShell runner build step: enter image description here

But the above does not work.

I get this error

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

As you can see, it seems that PowerShell insist on interpreting the parameter as a string.

I have tried many variants of writing the script argument. None of these work:

-preRelease:%IncludePreRelease%
-preRelease:([boolean]%IncludePreRelease%)
-preRelease:([System.Convert]::ToBoolean(%IncludePreRelease%))
like image 263
Klas Mellbourn Avatar asked Oct 13 '14 12:10

Klas Mellbourn


People also ask

How do I create a switch parameter in PowerShell?

To create a switch parameter in a function, specify the switch type in the parameter definition. Switch parameters are easy to use and are preferred over Boolean parameters, which have a less natural syntax for PowerShell. For example, to use a switch parameter, the user types the parameter in the command.

What is parameter in TeamCity?

Last modified: 30 August 2022. Build parameters are name-value pairs, defined by a user or provided by TeamCity, which can be used in a build. They help flexibly share settings and pass them to build steps.


2 Answers

This is an old question, but if you are still looking for an answer, I managed to get it working.

The main trick is that you shouldn't actually use the colon between the parameter name and the value as you would with PowerShell (I know, confusing...).

It looks like TeamCity is invoking the script in a different way and passes the parameters as string.

So with your example, the following should work: -preRelease $%IncludePreRelease%

Note that I have added a dollar sign in front of the TeamCity variable to change "true" into "$true"

Let me know if it works for you

Thanks!

like image 54
Fabien Ruffin Avatar answered Nov 09 '22 22:11

Fabien Ruffin


No, this still won't work. It seems that TC will always treat the value as a string no matter what. Maybe the answer was from a version of TC that allowed this, but the latest release does not.

Without colon:

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

With colon:

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

Removing the [switch] also does not work as any value you give it will not be treated as a Boolean - but rather a string assigned to a Boolean - and, thus, all Boolean operations will be $true.

In other words, anything you send will look like:

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

(none of which are == $false but all of which are equivalent to $true)

I have no idea how to get TC to accept Booleans! Best I could do was assume the argument was a string and use System.Convert.ToBoolean() internally in my script...

like image 32
Jeff Inflection Avatar answered Nov 09 '22 23:11

Jeff Inflection