web-dev-qa-db-fra.com

Comment passer des valeurs booléennes à un script PowerShell à partir d'une invite de commande

Je dois appeler un script PowerShell à partir d'un fichier de commandes. L'un des arguments du script est une valeur booléenne:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false

La commande échoue avec l'erreur suivante:

Cannot process argument transformation on parameter 'Unify'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead.

At line:0 char:1
+  <<<< <br/>
+ CategoryInfo          : InvalidData: (:) [RunScript.ps1], ParentContainsErrorRecordException <br/>
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,RunScript.ps1

A partir de maintenant, j'utilise une chaîne pour la conversion booléenne dans mon script. Mais comment puis-je transmettre des arguments booléens à PowerShell?

85
mutelogan

Il semble que powershell.exe n'évalue pas complètement les arguments de script lorsque le paramètre -File Est utilisé. En particulier, l'argument $false Est traité comme une valeur de chaîne, à l'instar de l'exemple ci-dessous:

PS> function f( [bool]$b ) { $b }; f -b '$false'
f : Cannot process argument transformation on parameter 'b'. Cannot convert value 
"System.String" to type "System.Boolean", parameters of this type only accept 
booleans or numbers, use $true, $false, 1 or 0 instead.
At line:1 char:36
+ function f( [bool]$b ) { $b }; f -b <<<<  '$false'
    + CategoryInfo          : InvalidData: (:) [f], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,f

Au lieu d'utiliser -File, Vous pouvez essayer -Command, Qui évaluera l'appel en tant que script:

CMD> powershell.exe -NoProfile -Command .\RunScript.ps1 -Turn 1 -Unify $false
Turn: 1
Unify: False

Comme David le suggère, utiliser un argument switch serait également plus idiomatique, simplifiant l'appel en supprimant la nécessité de passer explicitement une valeur booléenne:

CMD> powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify
Turn: 1
Unify: True
50
Emperor XLII

Une utilisation plus claire pourrait consister à utiliser des paramètres de commutateur. Ensuite, l’existence du paramètre Unify signifierait qu’il a été défini.

Ainsi:

param (
  [int] $Turn,
  [switch] $Unify
)
157
David Mohundro

Essayez de définir le type de votre paramètre sur [bool]:

param
(
    [int]$Turn = 0
    [bool]$Unity = $false
)

switch ($Unity)
{
    $true { "That was true."; break }
    default { "Whatever it was, it wasn't true."; break }
}

Cet exemple utilise par défaut $Unity à $false si aucune entrée n'est fournie.

tilisation

.\RunScript.ps1 -Turn 1 -Unity $false
11
Filburt

C'est une question plus ancienne, mais la documentation de PowerShell contient une réponse à cette question. J'ai eu le même problème, et pour une fois RTFM l'a réellement résolu. Presque.

https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.core/about/about_powershell_exe

La documentation du paramètre -File indique que "Dans de rares cas, vous devrez peut-être fournir une valeur booléenne pour un paramètre de commutateur. Pour fournir une valeur booléenne pour un paramètre de commutateur dans la valeur du paramètre File, insérez le nom et la valeur du paramètre dans des accolades, telles que: -File.\Get-Script.ps1 {-All: $ False} "

Je devais l'écrire comme ceci:

PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}

Donc, pas de '$' avant la déclaration true/false, et cela a fonctionné pour moi, sur PowerShell 4.0

6
LarsWA

Je pense que la meilleure façon d’utiliser/définir une valeur booléenne en tant que paramètre est de l’utiliser comme suit dans votre script PS:

Param(
    [Parameter(Mandatory=$false)][ValidateSet("true", "false")][string]$deployApp="false"   
)

$deployAppBool = $false
switch($deployPmCmParse.ToLower()) {
    "true" { $deployAppBool = $true }
    default { $deployAppBool = $false }
}

Alors maintenant, vous pouvez l'utiliser comme ceci:

.\myApp.ps1 -deployAppBool True
.\myApp.ps1 -deployAppBool TRUE
.\myApp.ps1 -deployAppBool true
.\myApp.ps1 -deployAppBool "true"
.\myApp.ps1 -deployAppBool false
#and etc...

Ainsi, dans les arguments de cmd, vous pouvez passer la valeur booléenne sous la forme d'une simple chaîne :).

5
Drasius