2012-07-06 29 views
25

Normalmente, se si desidera rinviare la specifica di un parametro switch a una variabile, è possibile passare un'espressione al parametro switch, come mostrato con il parametro WhatIf.PowerShell: come faccio a passare le variabili per cambiare i parametri quando richiamo PowerShell nella riga di comando?

test.ps1 

param ([string] $source, [string] $dest, [switch] $test) 
Copy-Item -Path $source -Destination $dest -WhatIf:$test 

Ciò consente una grande flessibilità quando si lavora con gli interruttori. Tuttavia, quando si chiama PowerShell con cmd.exe o qualcosa, si finisce con qualcosa di simile:

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 

Tuttavia, lo stesso risultato appare quando passa -test:true e -test:1. Perché non funziona? Non dovrebbe il sistema di conversione di tipo di Powershell riconoscere automaticamente queste stringhe come convertibili in bool o switch e convertirle?

Ciò significa che quando si chiamano script PowerShell da un altro sistema (come un sistema di compilazione) è necessario costruire strutture di controllo del flusso complesse per determinare se includere o meno un interruttore nella stringa di comando o ometterlo? Questo sembra noioso e soggetto a errori, il che mi porta a credere che non sia così.

risposta

9

Utilizzare la proprietà IsPresent dello switch. Esempio:

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 

BTW, ho usato funzioni, piuttosto che uno script in modo sarebbe più facile da verificare.

+0

che in realtà è quello che ho provato nel primo esempio - il problema sembra essere che PowerShell non valuta il parametro come espressione quando lo script viene richiamato da cmd.exe, ma piuttosto che ci vuole "$ true" come una stringa opaca. – bwerks

+0

Ho perso quella sfumatura. Aggiornerò la mia risposta –

19

Questo comportamento è stato archiviato come bug su connect. Si tratta di una soluzione alternativa:

powershell ./test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true 
Problemi correlati