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ì.
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
Ho perso quella sfumatura. Aggiornerò la mia risposta –