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
À partir de maintenant, j'utilise une conversion de chaîne en booléen dans mon script. Mais comment puis-je transmettre des arguments booléens à PowerShell?
la source
Une utilisation plus claire pourrait être d'utiliser des paramètres de commutation à la place. Ensuite, juste l'existence du paramètre Unify signifierait qu'il a été défini.
Ainsi:
la source
[switch] $Unify = $false
$false
. Il n'est donc pas nécessaire de définir explicitement une valeur par défaut.C'est une question plus ancienne, mais il y a en fait une réponse à cela dans la documentation PowerShell. J'ai eu le même problème, et pour une fois RTFM l'a 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 accolades, telles que les suivantes: -File. \ Get-Script.ps1 {-All: $ False} "
J'ai dû l'écrire comme ceci:
Donc pas de '$' avant l'instruction true / false, et cela a fonctionné pour moi, sur PowerShell 4.0
la source
powershell -h
.$
); notez également qu'il n'est plus nécessaire dans PowerShell Core . J'ai demandé que la documentation soit corrigée; voir github.com/MicrosoftDocs/PowerShell-Docs/issues/4964Essayez de définir le type de votre paramètre sur
[bool]
:Cet exemple est défini
$Unity
par défaut$false
si aucune entrée n'est fournie.Usage
la source
-File
paramètre devraient couvrir tous les aspects de la question originale. Je vais laisser ma réponse car quelqu'un peut également trouver mon indice sur la fourniture d'une valeur par défaut utile.Je pense que la meilleure façon d'utiliser / définir une valeur booléenne comme paramètre est de l'utiliser dans votre script PS comme ceci:
Alors maintenant, vous pouvez l'utiliser comme ceci:
Ainsi, dans les arguments de cmd, vous pouvez passer une valeur booléenne sous forme de chaîne simple :).
la source
Dans PowerShell, les paramètres booléens peuvent être déclarés en mentionnant leur type avant leur variable.
Vous pouvez attribuer une valeur en passant $ true | $ false
la source
Pour résumer et compléter les réponses existantes , à partir de Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
La réponse de David Mohundro indique à juste titre qu'au lieu de
[bool]
paramètres, vous devez utiliser des[switch]
paramètres dans PowerShell , où la présence ou l'absence du nom du commutateur (-Unify
spécifié ou non spécifié) implique sa valeur , ce qui fait disparaître le problème d'origine.Cependant, à l'occasion, vous devrez peut-être toujours transmettre la valeur du commutateur explicitement , en particulier si vous construisez une ligne de commande par programme :
Dans PowerShell Core , le problème d'origine (décrit dans la réponse d'Empereur XLII ) a été corrigé .
Autrement dit, pour passer
$true
explicitement à un[switch]
paramètre nommé,-Unify
vous pouvez maintenant écrire:Les valeurs suivantes peuvent être utilisées:
$false
,false
,$true
,true
, mais notez que le passage0
ou1
ne pas travailler.Notez comment le nom du commutateur est séparé de la valeur avec
:
et il ne doit y avoir aucun espace entre les deux.Remarque: Si vous déclarez un
[bool]
paramètre au lieu de a[switch]
(ce que vous ne devriez généralement pas), vous devez utiliser la même syntaxe; même si cela-Unify $false
devrait fonctionner, cela ne fonctionne pas actuellement - voir ce problème GitHub .Dans Windows PowerShell , le problème d'origine persiste et, étant donné que Windows PowerShell n'est plus activement développé, il est peu probable qu'il soit résolu.
La solution de contournement suggérée dans la réponse de LarsWA - même si elle est basée sur la rubrique d'aide officielle au moment de la rédaction de cet article - ne fonctionne pas dans la v5.1
Utiliser
-Command
au lieu de-File
est la seule solution de contournement efficace :Avec
-Command
vous passez effectivement un morceau de code PowerShell , qui est ensuite évalué comme d'habitude - et à l'intérieur de PowerShell passant$true
et$false
fonctionne (mais pastrue
etfalse
, comme maintenant également accepté avec-File
).Mises en garde :
L'utilisation
-Command
peut entraîner une interprétation supplémentaire de vos arguments, par exemple s'ils contiennent des$
caractères. (avec-File
, les arguments sont des littéraux ).L'utilisation
-Command
peut entraîner un code de sortie différent .Pour plus de détails, consultez cette réponse et cette réponse .
la source
J'avais quelque chose de similaire lors du passage d'un script à une fonction avec invoke-command. J'ai exécuté la commande entre guillemets simples au lieu de guillemets doubles, car elle devient alors une chaîne littérale.
'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
la source
L'exécution de scripts PowerShell sur Linux à partir de bash pose le même problème. Résolu presque la même chose que la réponse de LarsWA:
Travail:
Ca ne fonctionne pas:
la source
Vous pouvez également utiliser
0
pourFalse
ou1
pourTrue
. Cela suggère en fait que dans le message d'erreur:Pour plus d'informations, consultez cet article MSDN sur les valeurs booléennes et les opérateurs .
la source
-File
interprète comme une chaîne, échoue donc avec la même erreur.