Comment transmettre des valeurs booléennes pour un script PowerShell à partir d'une invite de commandes
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
Dès maintenant je suis à l'aide d'une chaîne de conversion booléenne à l'intérieur de mon script. Mais comment puis-je passer boolean arguments pour PowerShell?
Vous devez vous connecter pour publier un commentaire.
Il semble que powershell.exe ne pas évaluer pleinement les arguments du script lors de la
-File
paramètre est utilisé. En particulier, la$false
argument est traité comme une chaîne de valeur, d'une manière similaire à l'exemple ci-dessous:Au lieu d'utiliser
-File
vous pouvez essayer de-Command
, qui permettra d'évaluer l'appel du script:Comme David l'indique, à l'aide d'un commutateur d'argument serait également plus idiomatiques, la simplification de l'appel par la suppression de la nécessité de passer d'une valeur booléenne explicitement:
Plus précises d'utilisation pourrait être d'utiliser les paramètres de commutateur à la place. Ensuite, il suffit de l'existence de l'Unifier paramètre signifie qu'il a été défini.
Comme suit:
[switch] $Unify = $false
$false
. Donc il n'y a pas besoin de définir explicitement une valeur par défaut.Essayez de définir le type de paramètre à
[bool]
:Cet exemple, les valeurs par défaut
$Unity
à$false
si aucune entrée n'est fourni.Utilisation
-File
paramètre doit couvrir tous les aspects de la question d'origine. Je vais laisser ma réponse parce que quelqu'un peut aussi trouver mon soupçon sur la fourniture d'une valeur par défaut utiles.C'est une vieille question, mais il est en fait une réponse à cela dans le PowerShell documentation. J'ai eu le même problème, et pour une fois RTFM effectivement résolu. Presque.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
Documentation du Fichier de paramètre que
"Dans de rares cas, vous pourriez avoir besoin de fournir une valeur Booléenne pour un paramètre de commutateur. Pour fournir une valeur Booléenne pour un paramètre de commutateur de la valeur du paramètre de Fichier, placez le nom du paramètre et la valeur dans des accolades, telles que les suivantes: -Fichier .\Get-Script.ps1 { -All:$False}"
J'ai eu à l'écrire comme ceci:
Donc pas de '$' avant de la vraie/fausse déclaration, et qui a fonctionné pour moi, sur PowerShell 4.0
powershell -h
.Je pense, le meilleur moyen de l'utilisation/ensemble booléen en paramètre est à utiliser dans votre PS script comme ceci:
Alors maintenant, vous pouvez l'utiliser comme ceci:
Donc dans les arguments de la cmd vous pouvez passer une valeur booléenne simple chaîne :).
Vous pouvez également utiliser
0
pourFalse
ou1
pourTrue
. Ce fait suggère que le message d'erreur:Pour plus d'informations, consultez cet article MSDN sur Les Valeurs booléennes et les Opérateurs.
-File
l'interprète comme un string, échoue donc avec la même erreur.