Centrum Skryptów - Systemy Operacyjne

Jak używać parametru –ErrorAction do wyboru odpowiedniej opcji?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak używać parametru –ErrorAction do wyboru odpowiedniej opcji?

Cześć, Skrypciarze! Z przyjemnością przeczytałem wasz wczorajszy artykuł o używaniu zmiennej $ErrorActionPreference do kontroli sposobu działania skryptu. W poleceniu „On Error Resume Next” języka VBScript nigdy nie podobało mi się to, że działa ono na zasadzie wszystko albo nic. Niektórych błędów nie ma potrzeby wyświetlać, ale inne zdecydowanie warto. Czy jest jakiś alternatywny sposób używania zmiennej $ErrorActionPreference?

-- TS

Cześć, TS! Czołem, tutaj skrypciarz Ed Wilson. Dzisiaj mam wariacki dzień i nie zmieni się to aż do wieczora. Niedawno skończyłem jedno spotkanie, a wkrótce będę miał kolejne. Rano prowadziłem prezentację w programie Live Meeting dla grupy deweloperów z Oklahoma City (j.ang.), a wieczorem mam prowadzić jeszcze jedną. Zaraz po skończeniu porannej prezentacji mieliśmy z Craigiem konferencję telefoniczną z zespołem firmy Microsoft zajmującym się kontaktem ze społecznością użytkowników. Oprócz tych trzech spotkań miałem mieć jeszcze dwa kolejne, które jednak zostały odwołane. Problem z odwołanymi spotkaniami polega na tym, że mają one tendencję do wskakiwania z powrotem do kalendarza. Tak czy inaczej, czas przeznaczony na spotkania wykorzystałem, aby odebrać pocztę przesłaną na adres scripter@microsoft.com.

Jedną z największych zalet programu Windows PowerShell jest możliwość użycia parametru –ErrorAction. Jest to parametr standardowy, co oznacza, że jest dostępny dla wszystkich apletów poleceń. Pozwala to określić niestandardowe działanie po wystąpieniu błędu dla każdego apletu polecenia i każdego wiersza kodu w skrypcie. Pierwszy wiersz kodu widzianego tutaj sprawia, że podawana jest informacja o ewentualnym wystąpieniu błędu podczas pobierania zawartości pliku c:\fso\computers.txt file. Jeśli wystąpi błąd, wykonywanie skryptu będzie kontynuowane po wyświetleniu odpowiedniej informacji. W drugim podana jest wartość erroraction równa stop. Oznacza to, że jeśli aplet polecenia Get-Content nie zlokalizuje elementu foo, skrypt się zatrzyma. Widać to poniżej:

Get-Content -ErrorAction continue -Path C:\fso\Computers.txt

Get-Content -ErrorAction stop -Path foo

Po uruchomieniu skryptu zostaną wyświetlone dane wyjściowe takie, jak widać poniżej.

Parametr –ErrorAction działa tak samo, jak zmienna automatyczna $ErrorActionPreference. O zmiennej automatycznej $ErrorActionPreference mówiliśmy we wczorajszym artykule z serii „Cześć, Skrypciarze”.

W razie pracy interaktywnej z konsoli programu Windows PowerShell wpisywanie parametru –ErrorAction za każdym razem, gdy chcemy określić inne działanie po wystąpienie błędu może być niewygodne. Rozwinięcie znaków tabulacji może pomóc, ale nie zawsze. Aby obejść ten problem, można używać aliasu parametru, czyli ea. Widać to poniżej:

PS C:\> Get-WmiObject -Class win32_bios -EA silentlyContinue





SMBIOSBIOSVersion : A05

Manufacturer      : Dell Inc.

Name              : Phoenix ROM BIOS PLUS Version 1.10 A05

SerialNumber      : BDY91L1

Version           : DELL   - 15







PS C:\>

W przypadku rozwinięcia znaków tabulacji główny problem nie polega na wpisaniu nazwy parametru –ErrorAction, ale na podaniu jego wartości. Należy pamiętać, że parametr –ErrorAction oczekuje wartości w postaci ciągu znaków, tak więc nie ma potrzeby podawania wartości ujętej w cudzysłów. Cudzysłowy można więc pominąć, a wszystko będzie i tak działać bez problemu. Rzecz jasna, jeśli się zapomnimy i ujmiemy wartość w cudzysłów, również nie będzie to problemem. Widać to poniżej:

PS C:\> Get-WmiObject -Class win32_bios -EA "silentlyContinue"





SMBIOSBIOSVersion : A05

Manufacturer      : Dell Inc.

Name              : Phoenix ROM BIOS PLUS Version 1.10 A05

SerialNumber      : BDY91L1

Version           : DELL   - 15







PS C:\>

Należy jednak uważać, aby poprawnie wpisać nazwę parametru. W razie pomyłki zostanie wygenerowany błąd z informacją o dozwolonych parametrach. Widać to poniżej:

PS C:\> Get-WmiObject -Class win32_bios -EA silentlyContinuee

Get-WmiObject : Nie można powiązać parametru 'ErrorAction'. Nie można przekonwertować wartości "silentlyContinuee" na typ "System.Management.Automation.ActionPreference" z powodu nieprawidłowych wartości wyliczenia. Określ jedną z następujących wartości wyliczenia, a następnie spróbuj ponownie. Dozwolone wartości wyliczenia: "SilentlyContinue, Stop, Continue, Inquire".

At line:1 char:36

+ Get-WmiObject -Class win32_bios -EA <<<<  silentlyContinuee

    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ParameterBindingException

    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Należy zwrócić uwagę, że komunikat o błędzie podaje dozwolone wartości wyliczenia: SilentlyContinue, Stop, Continue i Inquire. Wartości, jakie można podać parametrowi –ErrorAction, należą do klasy System.Management.Automation.ActionPreference (j.ang.) platformy .NET. Wyliczenie i powiązane wartości są podane w tabeli 1:

Tabela 1

Wyliczenie Wartość Opis
SilentlyContinue 0 Program Windows PowerShell będzie kontynuował wykonywanie bez powiadamiania użytkownika o wystąpieniu działania.
Stop 1 Program Windows PowerShell zatrzyma wykonywanie po wystąpieniu działania.
UContinue 2 Program Windows PowerShell będzie kontynuował wykonywanie i powiadomi użytkownika o wystąpieniu działania.
Inquire 3 Program Windows PowerShell zatrzyma wykonywanie i zapyta użytkownika o sposób kontynuacji.

W starym artykule w blogu zespołu programu Windows PowerShell (j.ang.) podano, że można bezpośrednio używać wartości wyliczenia. Jest to bardzo korzystne rozwiązanie, jeśli chcemy wpisywać krótkie polecenia w konsoli programu Windows PowerShell. Użycie aliasu gc zamiast pełnej nazwy apletu polecenia Get-Content, opuszczenie ścieżki argumentu pozycyjnego i zastosowanie aliasu ea zamiast pełnej nazwy parametru –ErrorAction, a także podanie wartości wyliczenia 0, co odpowiada wartości SilentlyContinue, pozwala bardzo skrócić polecenie. Przykład widać poniżej:

PS C:\> gc foo -ea 0

PS C:\>

Jeśli chcemy, aby został wyświetlony monit o sposób kontynuacji, należy użyć wartości 3 dla parametru –ErrorAction:

PS C:\> gc foo -ea 3



Potwierdzanie

Nie można odnaleźć ścieżki 'C:\foo', ponieważ ona nie istnieje.

[T] Tak  [W] Tak dla wszystkich [Z] Zatrzymaj polecenie  [S] Wstrzymaj  [?] Pomoc (domyślnie "T"): t

Get-Content : Nie można odnaleźć ścieżki 'C:\foo', ponieważ ona nie istnieje.

At line:1 char:3

+ gc <<<<  foo -ea 3

    + CategoryInfo          : ObjectNotFound: (C:\foo:String) [Get-Content], ItemNotFoundException

    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand



PS C:\>

Nie zalecam używania aliasów i bezpośredniego podawania wartości wyliczenia w skrypcie, ponieważ zmniejsza to czytelność, co z kolei sprawia, że diagnozowanie ewentualnych problemów jest trudniejsze. Jednak w interaktywnej pracy w wierszu poleceń programu Windows PowerShell jest to dobre wyjście. Można nawet używać parametrów częściowych, o ile tylko wpiszemy na tyle dużą część nazwy parametru, aby była ona niepowtarzalna. W podanym przykładzie użyliśmy –com zamiast pełnego parametru –computer. Natomiast gwmi to alias apletu polecenia Get-WmiObject, a –ea to alias parametru –ErrorAction. Wartość wyliczenia 3 oznacza wyświetlenie monitu. Jeśli nie powiedzie sie połączenie apletu polecenia ze zdalnym komputerem o nazwie win7-pc1, zostanie wyświetlony monit o dalsze działanie. Używam klawisza „z”, co odpowiada zatrzymaniu polecenia. Następnie program Windows PowerShell wyświetla komunikat, że polecenie zostało zatrzymane na żądanie użytkownika. Widać to poniżej:

PS C:\> gwmi win32_bios -com win7-pc1 -ea 3



Potwierdzanie

Serwer RPC jest niedostępny. (Wyjątek od HRESULT: 0x800706BA)

[T] Tak  [W] Tak dla wszystkich [Z] Zatrzymaj polecenie  [S] Wstrzymaj  [?] Pomoc (domyślnie "T"): z

Get-WmiObject : Wykonywanie polecenia zostało zatrzymane, ponieważ użytkownik wybrał opcję Zatrzymaj.

At line:1 char:5

+ gwmi <<<<  win32_bios -com win7-pc1 -ea 3

    + CategoryInfo          : OperationStopped: (:) [Get-WmiObject], ParentContainsErrorRecordException

    + FullyQualifiedErrorId : ActionPreferenceStop,Microsoft.PowerShell.Commands.GetWmiObjectCommand



PS C:\>

Mam nadzieję, TS, że to ułatwi Ci używanie parametru –ErrorAction do wyboru odpowiedniej opcji.

Skrypciarze Ed Wilson i Craig Liebendorfer

 Do początku strony Do początku strony

Centrum Skryptów - Systemy Operacyjne