2012-07-06 18 views
25

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.

Respuesta

9

Utilice la propiedad IsPresent del conmutador. Ejemplo:

function test-switch{ 
param([switch]$test) 
    function inner{ 
    param([switch]$inner_test) 
    write-host $inner_test 
    } 
    inner -inner_test:$test.IsPresent 
} 
test-switch -test:$true 
test-switch -test 
test-switch -test:$false 

True 
True 
False 

Por cierto, he usado funciones en lugar de una secuencia de comandos por lo que sería más fácil de probar.

+0

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

+0

Me perdí ese matiz. Actualizaré mi respuesta. –

19

Este comportamiento se ha archivado como un error en connect. Esta es una solución:

powershell ./test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true 
Cuestiones relacionadas