Jesteś daleko od celu.
Masz już ładny, duży komunikat o błędzie. Dlaczego na Ziemi miałbyś chcieć napisać kod, który sprawdza $?jawnie po każdym poleceniu ? Jest to niezwykle uciążliwe i podatne na błędy. Prawidłowym rozwiązaniem jest zaprzestanie sprawdzania$? .
Zamiast tego użyj wbudowanego mechanizmu PowerShell, aby wysadzić w powietrze. Możesz to włączyć, ustawiając preferencję błędu na najwyższy poziom:
$ErrorActionPreference = 'Stop'
Umieszczam to na początku każdego skryptu, który kiedykolwiek napisałem, i teraz nie muszę tego sprawdzać $?. To sprawia, że mój kod jest znacznie prostszy i bardziej niezawodny.
Jeśli napotkasz sytuacje, w których naprawdę musisz wyłączyć to zachowanie, możesz albo catchbłąd, albo przekazać ustawienie do określonej funkcji przy użyciu funkcji common -ErrorAction. W Twoim przypadku prawdopodobnie chcesz, aby proces zatrzymał się przy pierwszym błędzie, złapał błąd, a następnie zarejestrował go.
Zwróć uwagę, że nie obsługuje to przypadku, gdy zewnętrzne pliki wykonywalne zawodzą (zwykle kod zakończenia niezerowy), więc nadal musisz sprawdzić, $LASTEXITCODEczy któreś wywołujesz. Pomimo tego ograniczenia, ustawienie nadal oszczędza dużo kodu i wysiłku.
Dodatkowa niezawodność
Możesz również rozważyć użycie trybu ścisłego :
Set-StrictMode -Version Latest
Zapobiega to dyskretnemu kontynuowaniu programu PowerShell, gdy używasz nieistniejącej zmiennej oraz w innych dziwnych sytuacjach. (Zobacz -Versionparametr, aby uzyskać szczegółowe informacje o tym, co ogranicza).
Połączenie tych dwóch ustawień sprawia, że PowerShell jest znacznie bardziej odporny na awarie, co znacznie ułatwia programowanie w nim.