Normalmente, si desea aplazar la especificación de un parámetro de conmutación a alguna variable, puede pasar una expresión al parámetro de conmutación, como se ve con el parámetro WhatIf.Powershell: ¿Cómo paso las variables para cambiar los parámetros al invocar powershell en la línea de comando?
test.ps1
param ([string] $source, [string] $dest, [switch] $test)
Copy-Item -Path $source -Destination $dest -WhatIf:$test
Esto le permite una gran flexibilidad cuando se trabaja con interruptores. Sin embargo, cuando se llama PowerShell con cmd.exe o algo así, que terminan con algo como esto:
D:\test>powershell -file test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true
D:\test\test.ps1 : Cannot process argument transformation on
parameter 'test'. Cannot convert value "System.String" to type "System.Manageme
nt.Automation.SwitchParameter", parameters of this type only accept booleans or
numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+ <<<<
+ CategoryInfo : InvalidData: (:) [test.ps1], ParentContainsError
RecordException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1
Sin embargo, el mismo resultado aparece al pasar -test:true
y -test:1
. ¿Por qué esto no funciona? ¿No debería el sistema de conversión tipo Powershell reconocer automáticamente estas cadenas como convertibles a bool o switch, y convertirlas?
¿Esto significa que al llamar scripts de PowerShell desde algún otro sistema (como un sistema de compilación) es necesario construir estructuras de control de flujo complejas para determinar si incluir un cambio en la cadena de comandos u omitirlo? Esto parece tedioso y propenso a errores, lo que me lleva a pensar que no es el caso.
que en realidad es lo que he intentado en el primer ejemplo - el problema parece ser que PowerShell no evalúa el parámetro como una expresión cuando la secuencia de comandos se invoca desde cmd.exe, sino que lleva "$ true" como una cadena opaca. – bwerks
Me perdí ese matiz. Actualizaré mi respuesta. –