Eu tenho que invocar um script PowerShell de um arquivo em lote. Um dos argumentos do script é um valor booleano:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false
O comando falha com o seguinte erro:
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
No momento, estou usando uma string para conversão booleana dentro do meu script. Mas como posso passar argumentos booleanos para PowerShell?
fonte
Um uso mais claro pode ser usar parâmetros de switch. Então, apenas a existência do parâmetro Unify significaria que ele foi definido.
Igual a:
fonte
[switch] $Unify = $false
$false
. Portanto, não há necessidade de definir explicitamente um valor padrão.Esta é uma pergunta mais antiga, mas na verdade há uma resposta para ela na documentação do PowerShell. Eu tive o mesmo problema, e desta vez o RTFM realmente o resolveu. Quase.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
A documentação para o parâmetro -File afirma que "Em casos raros, pode ser necessário fornecer um valor booleano para um parâmetro switch. Para fornecer um valor booleano para um parâmetro switch no valor do parâmetro File, coloque o nome do parâmetro e o valor em chaves, como as seguintes: -File. \ Get-Script.ps1 {-All: $ False} "
Eu tive que escrever assim:
Portanto, sem '$' antes da declaração verdadeiro / falso, e funcionou para mim, no PowerShell 4.0
fonte
powershell -h
.$
); também observe que não é mais necessário no PowerShell Core . Pedi que a documentação seja corrigida; consulte github.com/MicrosoftDocs/PowerShell-Docs/issues/4964Tente definir o tipo de seu parâmetro para
[bool]
:Este exemplo padrões
$Unity
para$false
se nenhuma entrada é fornecida.Uso
fonte
-File
parâmetro devem cobrir todos os aspectos da pergunta original. Vou deixar minha resposta porque alguém também pode achar útil minha dica sobre como fornecer um valor padrão.Eu acho que a melhor maneira de usar / definir o valor booleano como parâmetro é usar em seu script PS assim:
Então agora você pode usá-lo assim:
Portanto, em argumentos de cmd, você pode passar o valor booleano como string simples :).
fonte
No PowerShell, os parâmetros booleanos podem ser declarados mencionando seu tipo antes de sua variável.
Você pode atribuir valor passando $ true | $ false
fonte
Para resumir e complementar as respostas existentes , a partir do Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
A resposta de David Mohundro aponta corretamente que, em vez de
[bool]
parâmetros, você deve usar[switch]
parâmetros no PowerShell , onde a presença vs. ausência do nome do switch (-Unify
especificado vs. não especificado) implica seu valor , o que faz com que o problema original desapareça.No entanto, às vezes você ainda pode precisar passar o valor de switch explicitamente , especialmente se você estiver construindo uma linha de comando programaticamente :
No PowerShell Core , o problema original (descrito na resposta do Imperador XLII ) foi corrigido .
Ou seja, para passar
$true
explicitamente para um[switch]
parâmetro denominado,-Unify
agora você pode escrever:Os seguintes valores podem ser usados:
$false
,false
,$true
,true
, mas nota que passa0
ou1
faz não trabalho.Observe como o nome do switch é separado do valor com
:
e não deve haver nenhum espaço em branco entre os dois.Nota: Se você declarar um
[bool]
parâmetro em vez de[switch]
(o que geralmente não deve ser feito), deverá usar a mesma sintaxe; embora-Unify $false
deva funcionar, atualmente não funciona - veja este problema do GitHub .No Windows PowerShell , o problema original persiste e - visto que o Windows PowerShell não é mais desenvolvido ativamente - é improvável que seja corrigido.
A solução alternativa sugerida na resposta do LarsWA - embora seja baseada no tópico de ajuda oficial no momento da redação deste documento - não funciona na v5.1
Usar em
-Command
vez de-File
é a única solução alternativa eficaz :Com
-Command
você está efetivamente passando uma parte do código do PowerShell , que é então avaliado como de costume - e dentro do PowerShell passando$true
e$false
funciona (mas nãotrue
efalse
, como agora também é aceito com-File
).Advertências :
Usar
-Command
pode resultar em uma interpretação adicional de seus argumentos, como se eles contivessem$
chars. (com-File
, os argumentos são literais ).O uso
-Command
pode resultar em um código de saída diferente .Para detalhes, veja esta resposta e esta resposta .
fonte
Tive algo semelhante ao passar um script para uma função com invoke-command. Executei o comando entre aspas simples em vez de aspas duplas, porque então ele se torna um literal de string.
'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
fonte
A execução de scripts do PowerShell no Linux a partir do bash apresenta o mesmo problema. Resolvido quase da mesma forma que a resposta de LarsWA:
Trabalhando:
Não está funcionando:
fonte
Você também pode usar
0
paraFalse
ou1
paraTrue
. Na verdade, sugere que na mensagem de erro:Para obter mais informações, consulte este artigo do MSDN sobre Boolean Values and Operators .
fonte
-File
interpreta como string, portanto, falha com o mesmo erro.