2014-09-29 16 views
13

Proste pytanie, czy możliwe jest wygenerowanie niestandardowego komunikatu o błędzie, gdy test się nie powiedzie, np. Test-Path?Błąd niestandardowy PowerShell od parametrów

Zamiast tego:

Test-Folder: Nie można zweryfikować tezę o parametrze 'Folder'. Skrypt sprawdzania poprawności "Test-Path $ _ -Path Type Container" dla argumentu o wartości "blabla" nie zwrócił wyniku True. Określ, dlaczego skrypt sprawdzania poprawności nie powiódł się, a następnie spróbuj ponownie przecinać i ponownie.

Byłoby miło mieć to zgłosić to zamiast w zmiennej $Error:

do „Folder” nie zostanie znaleziony, może są problemy z siecią?

Kod:

Function Test-Folder { 
    Param (
     [parameter(Mandatory=$true)] 
     [ValidateScript({Test-Path $_ -PathType Container})] 
     [String]$Folder 
    ) 
    Write-Host "The folder is: $Folder" 
} 

Obejście 1:

mogę usunąć Mandatory=$true i zmieniać go, jak poniżej. Ale to nie daje mi prawidłowej składni i nie sprawdza poprawności , ponieważ sprawdza tylko, czy parametr jest obecny.

Function Test-Folder { 
    Param (
     [parameter()] 
     [String]$Folder = $(throw "The $_ is not found, maybe there are network issues?") 
    ) 
    Write-Host "The folder is: $Folder" 
} 

Obejście 2:

znalazłem to obejście na blog, ale problemem jest to, że generuje 2 błędy zamiast jednego.

Function Test-Folder { 
    Param (
     [parameter(Mandatory=$true)] 
     [ValidateScript({ 
      if (Test-Path $_ -PathType Container) {$true} 
      else {Throw "The $_ is not found, maybe there are network issues?"}})] 
     [String]$Folder 
    ) 
    Write-Host "The folder is: $Folder" 
} 

Rozwiązanie 3:

Mógłbym także spróbować uczynić go bardziej jasne, dodając sekcję komentarz. Jednak nadal nie jest to pożądany wynik, ponieważ błąd musi być czytelny dla użytkowników końcowych.

Function Test-Folder { 
    Param (
     [parameter(Mandatory=$true)] 
     [ValidateScript({ 
     # The folder is not found, maybe there are network issues? 
     Test-Path $_ -PathType Container})] 
     [String]$Folder 
    ) 
    Write-Host "The folder is: $Folder" 
} 
+1

Miałem ten sam problem i znalazłem ten post. Znalazłem także to, co nazywasz obejściem 2. W przeciwieństwie do ciebie, dostałem tylko jeden błąd. Być może wersja PowerShell odgrywa w tym rolę. 'M: \ Scripts \ Move-MaintenanceData.ps1: Nie można sprawdzić poprawności argumentu parametru" Źródło ". C: \ werwer nie wydaje się być prawidłowym folderem. " – Matt

+1

Masz rację, nie mam już tego problemu. Musi więc zależeć od wersji PowerShell, której używa. Problem rozwiązany :) – DarkLite1

Odpowiedz

9

Twój ValidateScript powinien wyglądać mniej więcej tak:

[ValidateScript({ 
    try { 
     $Folder = Get-Item $_ -ErrorAction Stop 
    } catch [System.Management.Automation.ItemNotFoundException] { 
     Throw [System.Management.Automation.ItemNotFoundException] "${_} Maybe there are network issues?" 
    } 
    if ($Folder.PSIsContainer) { 
     $True 
    } else { 
     Throw [System.Management.Automation.ValidationMetadataException] "The path '${_}' is not a container." 
    } 
})] 

które dadzą Ci wiadomość tak:

Test-folder: nie możemy zweryfikować tezę o parametrze 'Folder'. Nie można znaleźć znaleźć ścieżki "\\ serwer \ Temp \ asdf", ponieważ nie istnieje. Może są problemy sieciowe z numerem ?

Lub:

Test-Folder: Nie można zweryfikować tezę o parametrze 'Folder'. Ścieżka '\\ serwer \ Temp \ asdf' nie jest kontenerem.

Jeżeli starsze wersje POSH rzucają podwójny błąd, może trzeba przetestować wewnątrz funkcji:

Function Test-Folder { 
    Param (
     [parameter(Mandatory=$true)] 
     [String]$Folder 
    ) 

    try { 
     $Folder = Get-Item $_ -ErrorAction Stop 
    } catch [System.Management.Automation.ItemNotFoundException] { 
     Throw [System.Management.Automation.ItemNotFoundException] "The '${Folder}' is not found, maybe there are network issues?" 
    } 

    if (-not $Folder.PSIsContainer) { 
     Throw [System.Management.Automation.ApplicationFailedException] "The path '${_}' is not a container." 
    } 

    Write-Host "The folder is: ${Folder}" 
} 

Część że zawsze nienawidził w POSH próbuje dowiedzieć się, co błędem łapać; bez łapania wszystkiego. Odkąd to rozgryzłem, oto jak:

+1

To świetna wskazówka VertigoRay! Thx man! – DarkLite1

+0

Cieszę się, że Ci się podobało, @ DarkLite1 ... Właśnie zdałem sobie sprawę, że nie odpowiedziałem na to pytanie całkowicie, więc zaktualizowałem je. Mając nadzieję, że ta wersja jest wystarczająco dobra, aby zostać oznaczoną jako odpowiedź. ;) – VertigoRay

+1

Uwaga: To nie działa tak dobrze z Write-Error, domyślnie ignoruje go całkowicie i jeśli użyjesz -ErrorAction, otrzymasz '" Uruchomione polecenie zostało zatrzymane, ponieważ zmienna preferencji "ErrorActionPreference" lub wspólny parametr jest ustawiony na Zatrzymaj: 'przed błędem niestandardowym. –

2

Wydaje mi się, że znalazłeś proste obejścia do przodu.

Logika sprawdzania parametrów jest rozszerzalna, ale wymaga trochę C#. Jeśli zaimplementujesz klasę abstrakcyjną System.Management.Automation.ValidateArgumentsAttribute, twoja implementacja może rzucić wyjątek System.Management.Automation.ValidationMetadtaException, którego PowerShell użyje do zgłoszenia błędu, i możesz oczywiście użyć dowolnej wiadomości, którą lubisz podczas tworzenia tego wyjątku.

+1

Thx za opinie Jason. Czy możesz podać mały przykład, jak wdrożyć taką abstrakcyjną klasę? Nie jestem programistą. – DarkLite1

0

Nie jestem pewien. Sugestia: może chcesz tylko uwięzić błąd, stworzyć własną wiadomość.

trap [Error.Type] { 
    @" 
    The message you want displayed 
    With maybe some info additional info. 
    ie : The full message itself: {0}' -f $_.Error.Message; 
    continue; 
} 
+0

Thx za sugestię. Tak, chciałbym napisać własną wiadomość. Jeśli używam sugestii 'pułapki', muszę to zrobić poza moją funkcją, jak sądzę? Byłby to problem, ponieważ w moim skrypcie pojawiają się inne komunikaty o błędach. – DarkLite1

Powiązane problemy