Saya telah mencari cara untuk menghentikan skrip PowerShell (PS1) ketika kesalahan yang tidak dapat dipulihkan terjadi dalam suatu fungsi. Sebagai contoh:
function foo() {
# Do stuff that causes an error
$host.Exit()
}
Tentu saja tidak ada yang namanya $host.Exit()
. Ada $host.SetShouldExit()
, tapi ini sebenarnya menutup jendela konsol, yang bukan yang saya inginkan. Yang saya butuhkan adalah sesuatu yang setara dengan Python sys.exit()
yang hanya akan menghentikan eksekusi skrip saat ini tanpa kata perpisahan lebih lanjut.
Sunting: Ya, hanya saja exit
. Duh.
powershell
kprobst
sumber
sumber
Jawaban:
Anda harus menggunakan yang
exit
kata kunci .sumber
Saya menyadari ini adalah posting lama tapi saya sering kembali ke utas ini karena ini adalah salah satu hasil pencarian teratas ketika mencari topik ini. Namun, saya selalu lebih bingung ketika saya datang karena informasi yang saling bertentangan. Pada akhirnya saya selalu harus melakukan tes sendiri untuk mengetahuinya. Jadi kali ini saya akan memposting temuan saya.
TL; DR Kebanyakan orang ingin menggunakan
Exit
untuk menghentikan skrip yang sedang berjalan. Namun, jika skrip Anda hanya mendeklarasikan fungsi yang nantinya akan digunakan dalam shell, maka Anda akan ingin menggunakanReturn
definisi fungsi tersebut.Keluar vs Kembali vs Istirahat
Keluar: Ini akan "keluar" dari konteks yang sedang berjalan. Jika Anda memanggil perintah ini dari skrip, skrip akan keluar. Jika Anda memanggil perintah ini dari shell, shell akan keluar.
Jika suatu fungsi memanggil perintah Exit, ia akan keluar dari konteks apa pun yang sedang berjalan. Jadi, jika fungsi itu hanya dipanggil dari dalam skrip yang berjalan, ia akan keluar dari skrip itu. Namun, jika skrip Anda hanya mendeklarasikan fungsi sehingga dapat digunakan dari shell saat ini dan Anda menjalankan fungsi itu dari shell, itu akan keluar dari shell karena shell adalah konteks di mana fungsi yang mengendalikan
Exit
perintah sedang berjalan.Catatan: Secara default jika Anda mengklik kanan pada skrip untuk menjalankannya di PowerShell, setelah skrip selesai berjalan, PowerShell akan menutup secara otomatis. Ini tidak ada hubungannya dengan
Exit
perintah atau apapun dalam skrip Anda. Ini hanya perilaku PowerShell default untuk skrip yang dijalankan menggunakan metode spesifik menjalankan skrip. Hal yang sama berlaku untuk file batch dan jendela Command Line.Kembali: Ini akan kembali ke titik panggilan sebelumnya. Jika Anda memanggil perintah ini dari skrip (di luar fungsi apa pun), perintah itu akan kembali ke shell. Jika Anda memanggil perintah ini dari shell, ia akan kembali ke shell (yang merupakan titik panggilan sebelumnya untuk satu perintah yang dijalankan dari shell). Jika Anda memanggil perintah ini dari suatu fungsi, ia akan kembali ke tempat dari mana fungsi itu dipanggil.
Eksekusi perintah apa pun setelah titik panggilan itu dikembalikan akan melanjutkan dari titik itu. Jika skrip dipanggil dari shell dan berisi
Return
perintah di luar fungsi apa pun maka ketika kembali ke shell tidak ada lagi perintah untuk dijalankan sehingga membuatReturn
digunakan dengan cara ini pada dasarnya sama denganExit
.Istirahat: Ini akan keluar dari loop dan beralih kasus. Jika Anda memanggil perintah ini saat tidak dalam satu loop atau beralih kasus itu akan keluar dari skrip. Jika Anda memanggil
Break
di dalam loop yang bersarang di dalam loop itu hanya akan keluar dari loop itu dipanggil.Ada juga fitur yang menarik di
Break
mana Anda bisa mengawali loop dengan label dan kemudian Anda bisa keluar dari loop berlabel bahkan jikaBreak
perintah dipanggil dalam beberapa grup bersarang di dalam loop berlabel.sumber
Exit
dapat mengambil kode kembali sebagai parameter (default ke 0) - misExit 3
.Get-Command Exit
danGet-Alias Exit
tanpa hasil. Saya kemudian melihat apakah itu kata kunci dan tidak menemukan dokumentasi resmi di situ. Melihat itu sekarang, saya tidak tahu bagaimana saya sampai pada kesimpulan itu. Jelas itu adalah kata kunci ( technet.microsoft.com/en-us/library/hh847744.aspx ). Mungkin karena Exit adalah satu-satunya kata kunci yang tidak memiliki topik bantuan help_ sendiri dan oleh karena itu daftar topik di sidebar kiri tidak memasukkannya.Exit
akan keluar dari PowerShell juga. Jika Anda ingin "keluar" hanya dari fungsi atau skrip saat ini - gunakanBreak
:)sumber
break
ketika ingin keluar dari fungsi saat ini ... skrip panggilan dapat terganggu juga!Write-Error adalah untuk kesalahan yang tidak berakhir dan lempar adalah untuk mengakhiri kesalahan
sumber
powershell -command "& module-function ..."
. Saya perlu mengonversi fungsi-fungsi itu untuk melempar ke try-catch dan keluar dari wrapping catch untuk benar-benar mengeluarkan kode keluar kesalahan.$PSCmdlet.ThrowTerminatingError()
untuk hal-hal tersebut ketika melempar tidak bisa menyelesaikan pekerjaan (masalah yang diketahui tanpa ada kesalahan penghentianthrow
)Hentikan proses ini dan berikan kode keluar yang ditentukan sistem operasi yang mendasarinya.
https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx
[Environment]::Exit(1)
Ini akan memungkinkan Anda untuk keluar dengan kode keluar khusus, yang dapat diambil dari pemanggil.
sumber
Exit 1
.[Environment]::Exit(1)
memiliki efek samping keluar dari jendela PowerShell saya ketika saya memintanya dalam skrip, sedangkan penggunaanexit
tampaknya tidak melakukannya.Saya pikir Anda mencari
Return
bukanBreak
. Break biasanya digunakan untuk loop dan hanya break dari blok kode terdalam. Gunakan Kembali untuk keluar dari suatu fungsi atau skrip.sumber
Return
hanya akan kembali dari fungsi, bukan dari skrip. (Return
pada tingkat atas naskah akan mengakhiri naskah, tapi itu bukan pertanyaannya.)Melempar pengecualian akan baik terutama jika Anda ingin menjelaskan alasan kesalahan:
Ini akan menghasilkan kesalahan penghentian.
sumber
Mungkin lebih baik menggunakan "trap". Jebakan PowerShell menentukan kode kunci untuk dijalankan saat penghentian atau kesalahan terjadi. Tipe
untuk mempelajari lebih lanjut tentang pernyataan perangkap.
sumber
Saya secara kebetulan menemukan bahwa (misalnya , di mana label tidak ada ) muncul untuk keluar dari seluruh skrip (bahkan dari dalam suatu fungsi) dan membuat host tetap hidup. Dengan cara ini Anda bisa membuat fungsi yang memecah skrip dari mana saja (mis. Loop rekursif) tanpa mengetahui ruang lingkup saat ini (dan membuat label):
Break <UnknownLabel>
Break Script
Script
sumber
Saya menggunakan ini untuk menjalankan kembali program. Saya tidak tahu apakah itu akan membantu, tetapi pernyataan sederhana jika memerlukan hanya dua entri yang berbeda. Ini bekerja dengan baik untuk saya.
Tidak tahu apakah ini bisa membantu, tetapi saya percaya ini akan sejalan dengan mengakhiri program setelah Anda menjalankannya. Namun dalam hal ini, setiap input yang ditentukan membutuhkan output yang terdaftar dan dikategorikan. Anda juga bisa meminta panggilan keluar keluar dari baris prompt baru dan menghentikan program dengan cara itu.
sumber