Powershell: Colon in commandlet parameters

When you do:

Move-ActiveMailboxDatabase -Confirm $false

you are not saying Confirm parameter accepts the $false. You are saying -Confirm and also passing an (separate) argument to the cmdlet with value $false.

Since Confirm is a switch, just the presence of -Confirm means it is true. Absence of -Confirm means it is false.

Let me give you a script example:

param([switch]$test)

write-host Test is $test

If you just run the script without any arguments / paramters i.e .\script.ps1 you get output:

Test is False

If you run it as .\script.ps1 -test, the output is

Test is True

If you run it as .\script.ps1 -test $false, the output is

Test is True

If you run it as .\script.ps1 -test:$false the output is

Test is False

It is in scenarios where the value for a switch variable itself has to be determined from another variable that the : is used.

For example, consider the script:

param ([boolean]$in)

function func([switch] $test){
write-host Test is $test
}

func -test:$in

Here if you run it as .\script.ps1 -in $false, you get

Test is false

If you weren’t able to use the :, you would have had to write it as:

if($in){  func -test}
else { func }

Leave a Comment