Çoğu powershell cmdlet'inin -ErrorAction parametresi vardır, bir hata durumunda yapılması istenen eylemi belirlemek için. Örneğin dosyanın olmaması durumunda hata vermeden sessizce devam etmesi için aşağıdaki gibi kullanım olabilir.
Ya da try-catch bloğu içinde her hatanın yakalanmasını sağlamak için Stop kullanmak isteyebiliriz.
Ama her cmdlet sonunda bu parametreyi seçmemek için $ErrorActionPreference değişkenini kullanabiliriz. Varsayılan değer Continue'dir. Atanan değerler tek veya çift tırnak içinde verilmelidir.
$ErrorActionPreference="Stop"
Genel olarak Preference Variables kategorisinde bazı değişkenlerin arasında yer alır. Şu değerlerden birini alabilir:
Break: Bir hata olduğunda veya bir istisna tetiklendiğinde debugger'a gir.
Continue: (Varsayılan) Hata mesajını görüntüle ve devam et.
Inquire: Hata mesajını görüntüle ve devam etmek isteyip istemediğini kullanıcıya sor.
SilentlyContinue: Hata mesajı da gösterme, devam et.
Stop: Hatayı görüntüle ve dur. Stop değeri ayrıca ActionPreferenceStopException nesnesi de oluşturarak hata akışına gönderir.
Bunların dışında -ErrorAction parametresi ile belirtilebilecek Ignore ve Suspend değerleri de var, ama $ErrorActionPreference olarak kullanılamıyor. Anlamları şöyle:
Ignore: Hata mesajını görmezden gel/gösterme ve çalışmaya devam et.
Suspend: Her hata sonrasında daha fazla inceleme için durulur, sonra çalışmaya devam edilir.
Bu konuyla yakından ilişkili olan "son komutun hata ile sonlanıp sonlanmadığını bildiren" bir otomatik değişken ($?) var. Basit bir şekilde (try-catch yapmaya gerek kalmadan) önceki komut hata verdiyse bir sonraki komutu ona ayarlamamızı sağlayacak bir yöntem. Örneğin
Remove-Item D:\olmayandosya.txt;if ($?) { "bulunamadi"}else { "silindi" }gibi bir komut ile silmek istediğimiz yoksa "bulunamadi", bulundu ve silindiyse "silindi" yazmasını bekliyorum. Bu haliyle çalışmaz çünkü varsayılan olarak $ErrorActionPreference="Stop" olduğu için hata sonunda noktalı virgülden ";" sonrası çalıştırılmaz, durdurulur. Öncesinde $ErrorActionPreference'i hatayı göstermeden devam edecek şekilde ayarlarsak olur:
$ErrorActionPreference="SilentlyContinue";Remove-Item D:\olmayandosya.txt;if ($?) {"bulunamadi"}else {"silindi"}
ErrorActionPreference tek satırlık bir etkiye sahip değil, oturum boyunca geçerli olacak. Bu sebeple işimiz bittikten sonra tekrar varsayılan değere eşitlemek gerekebilir. Gerekmeyebilir de. Ama gerekmeye de bilir gibi bir ifadeden kesinlikle kaçınmak gerek.
---
https://www.meziantou.net/stop-the-script-when-an-error-occurs-in-powershell.htm
https://www.scriptwizards.net/powershell-erroractionpreference-explained
Hiç yorum yok:
Yorum Gönder