$ LASTEXITCODE jest wyłącznie dla programów linii poleceń, które zwracają ich status. Cmdlet wbudowane w PS, takie jak Remove-item, zwracają błędy na maksymalnie 3 sposoby. W przypadku ostrzeżeń piszą one wiadomości (lub inne obiekty .NET) do "strumienia ostrzegawczego". W PSv3 istnieje prosty sposób przekierowania tego strumienia do pliku: cmdlet blah blah blah 3>warning.out
. Drugi to strumień błędów. Strumień ten może być przekierowywany również ... 2>error.out
, lub bardziej typowo błędy są wychwytywane przy pomocy try/catch lub trap, lub zapisywane do zmiennej za pomocą parametru -ErrorVariable (patrz help about_commonparameters
). Trzeci sposób polega na "wyrzucaniu" błędów. Jeśli nie zostanie złapany (spróbuj/złap lub pułapkę), zgłoszony błąd spowoduje zakończenie działania skryptu. Generowane błędy ogólnie są podklasami klasy .NET system.Management.Automation.ErrorRecord
. ErrorRecord zapewnia znacznie więcej informacji o błędzie niż kod powrotu.
Jeśli element remove nie powiedzie się z powodu błędu nie znaleziono pliku, zapisuje on System.Management.Automation.ItemNotFoundException
do strumienia błędów. Używając try/catch możesz filtrować dla tego konkretnego błędu lub innych określonych błędów z elementu remove. Jeśli po prostu wpisujesz polecenia PS z wiersza poleceń, możesz wpisać $error[0]|select-object *
, aby uzyskać wiele informacji na temat ostatniego błędu.
Można to zrobić:
try {
Remove-Item -Recurse -Force C:\users\bkp 2>&1
} catch {
# oops remove-item failed. Write warning then quit
# replace the following with what you want to do
write-warning "Remove-item encounter error: $_"
return # script failed
}
Można po prostu sprawdzić zmienną błędu $. Zawiera każdy błąd napotkany w twojej sesji, aż do punktu, ponieważ wierzę w limit alokacji pamięci. –