Saya harus menjalankan skrip PowerShell dari file batch. Salah satu argumen untuk skrip adalah nilai boolean:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false
Perintah gagal dengan kesalahan berikut:
Cannot process argument transformation on parameter 'Unify'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+ <<<< <br/>
+ CategoryInfo : InvalidData: (:) [RunScript.ps1], ParentContainsErrorRecordException <br/>
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,RunScript.ps1
Sampai sekarang saya menggunakan konversi string ke boolean di dalam skrip saya. Tapi bagaimana saya bisa meneruskan argumen boolean ke PowerShell?
sumber
Penggunaan yang lebih jelas mungkin menggunakan parameter sakelar sebagai gantinya. Kemudian, hanya keberadaan parameter Unify yang berarti telah ditetapkan.
Seperti:
sumber
[switch] $Unify = $false
$false
. Jadi tidak perlu menetapkan nilai default secara eksplisit.Ini adalah pertanyaan yang lebih lama, tetapi sebenarnya ada jawaban untuk ini di dokumentasi PowerShell. Saya memiliki masalah yang sama, dan untuk sekali RTFM benar-benar menyelesaikannya. Hampir.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
Dokumentasi untuk -File parameter menyatakan bahwa "Dalam kasus yang jarang terjadi, Anda mungkin perlu memberikan nilai Boolean untuk parameter switch. Untuk memberikan nilai Boolean untuk parameter switch dalam nilai parameter File, apit nama dan nilai parameter dalam tanda kurung kurawal, seperti berikut: -File. \ Get-Script.ps1 {-All: $ False} "
Saya harus menulisnya seperti ini:
Jadi tidak ada '$' sebelum pernyataan benar / salah, dan itu berhasil untuk saya, di PowerShell 4.0
sumber
powershell -h
.$
); perhatikan juga bahwa ini tidak lagi diperlukan di PowerShell Core . Saya telah meminta dokumentasi untuk dikoreksi; lihat github.com/MicrosoftDocs/PowerShell-Docs/issues/4964Coba tetapkan jenis parameter Anda ke
[bool]
:Contoh ini default
$Unity
untuk$false
jika tidak ada masukan disediakan.Pemakaian
sumber
-File
parameter harus mencakup setiap aspek dari pertanyaan asli. Saya akan meninggalkan jawaban saya karena seseorang mungkin juga menemukan petunjuk saya tentang memberikan nilai default berguna.Saya pikir, cara terbaik untuk menggunakan / menetapkan nilai boolean sebagai parameter adalah dengan menggunakan skrip PS Anda seperti ini:
Jadi sekarang Anda bisa menggunakannya seperti ini:
Jadi dalam argumen dari cmd Anda dapat mengirimkan nilai boolean sebagai string sederhana :).
sumber
Di PowerShell, parameter boolean dapat dideklarasikan dengan menyebutkan tipenya sebelum variabelnya.
Anda dapat menetapkan nilai dengan mengirimkan $ true | $ false
sumber
Untuk meringkas dan melengkapi jawaban yang ada , pada Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
Jawaban David Mohundro dengan tepat menunjukkan bahwa alih
[bool]
[switch]
- alih parameter Anda harus menggunakan parameter di PowerShell , di mana ada atau tidaknya nama sakelar (-Unify
ditentukan vs. tidak ditentukan) menyiratkan nilainya , yang membuat masalah aslinya hilang.Namun, terkadang Anda mungkin masih perlu meneruskan nilai sakelar secara eksplisit , terutama jika Anda membuat baris perintah secara terprogram :
Di PowerShell Core , masalah asli (dijelaskan dalam jawaban Kaisar XLII ) telah diperbaiki .
Artinya, untuk meneruskan
$true
secara eksplisit ke[switch]
parameter bernama-Unify
Anda sekarang dapat menulis:Nilai-nilai berikut dapat digunakan:
$false
,false
,$true
,true
, tapi catatan yang lewat0
atau1
tidak tidak bekerja.Perhatikan bagaimana nama sakelar dipisahkan dari nilai dengan
:
dan tidak boleh ada spasi kosong di antara keduanya.Catatan: Jika Anda mendeklarasikan
[bool]
parameter alih-alih a[switch]
(yang biasanya tidak seharusnya), Anda harus menggunakan sintaks yang sama; meskipun-Unify $false
seharusnya berfungsi, saat ini tidak - lihat masalah GitHub ini .Di Windows PowerShell , masalah asli tetap ada , dan - mengingat bahwa Windows PowerShell tidak lagi dikembangkan secara aktif - tidak mungkin diperbaiki.
Solusi yang disarankan dalam jawaban LarsWA - meskipun didasarkan pada topik bantuan resmi saat tulisan ini dibuat - tidak berfungsi di v5.1
Menggunakan
-Command
alih-alih-File
adalah satu-satunya solusi efektif :Dengan
-Command
Anda secara efektif mengirimkan sepotong kode PowerShell , yang kemudian dievaluasi seperti biasa - dan di dalam PowerShell meneruskan$true
dan$false
berfungsi (tetapi tidaktrue
danfalse
, seperti sekarang juga diterima dengan-File
).Peringatan :
Penggunaan
-Command
dapat menghasilkan interpretasi tambahan atas argumen Anda, seperti jika argumen berisi$
karakter. (dengan-File
, argumen adalah literal ).Penggunaan
-Command
dapat menghasilkan kode keluar yang berbeda .Untuk detailnya, lihat jawaban ini dan jawaban ini .
sumber
Saya memiliki sesuatu yang serupa ketika mengirimkan skrip ke fungsi dengan perintah-panggilan. Saya menjalankan perintah dalam tanda kutip tunggal, bukan tanda kutip ganda, karena ini kemudian menjadi string literal.
'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
sumber
Menjalankan skrip PowerShell di linux dari bash memberikan masalah yang sama. Menyelesaikannya hampir sama dengan jawaban LarsWA:
Kerja:
Tidak bekerja:
sumber
Anda juga bisa menggunakan
0
untukFalse
atau1
untukTrue
. Ini sebenarnya menunjukkan bahwa dalam pesan kesalahan:Untuk info lebih lanjut, lihat artikel MSDN ini tentang Nilai dan Operator Boolean .
sumber
-File
menafsirkannya sebagai string, sehingga gagal dengan kesalahan yang sama.