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?
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
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
)
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
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.
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
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 :).