Biasanya, jika Anda ingin menunda spesifikasi parameter switch ke beberapa variabel, Anda dapat mengoper ekspresi ke parameter switch, seperti yang terlihat pada parameter WhatIf.
test.ps1
param ( [string] $source, [string] $dest, [switch] $test )
Copy-Item -Path $source -Destination $dest -WhatIf:$test
Hal ini memberikan fleksibilitas yang tinggi ketika bekerja dengan switch. Namun, ketika Anda memanggil powershell dengan cmd.exe atau semacamnya, Anda akan mendapatkan hasil seperti ini:
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
Namun, hasil yang sama muncul ketika mengoper -test: true
, dan -test: 1
. Mengapa hal ini tidak berhasil? Bukankah seharusnya sistem konversi tipe Powershell secara otomatis mengenali string ini sebagai string yang dapat dikonversi menjadi bool atau switch, dan mengonversinya?
Apakah ini berarti bahwa ketika memanggil skrip powershell dari beberapa sistem lain (seperti sistem build), perlu untuk membangun struktur kontrol aliran yang kompleks untuk menentukan apakah akan menyertakan sakelar dalam string perintah, atau menghilangkannya? Hal ini tampak membosankan dan rentan terhadap kesalahan, yang membuat saya percaya bahwa itu tidak terjadi.
Gunakan properti IsPresent pada sakelar. Contoh:
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, saya menggunakan fungsi daripada skrip agar lebih mudah diuji.