PowerShell: błędy połowów, ale nadal bez pętli?

głosy
0

Lubię myśleć, że jestem całkiem dobry z PowerShell, ale jestem trochę zakłopotany tutaj.

Mam GIANT listę plików, które mam zamiar uruchomić ten kod na które dadzą mi trochę niezbędnych informacji o pliku, że będę uruchomić analityki dalej. krok jest po prostu coraz listę plików. Więc biegnę to.

Get-ChildItem $path -Recurse

Zwraca kilka niepotrzebnych informacji, ale również daje mi morzu czerwonych. Jest mnóstwo plików i folderów, które nie mogą być znalezione i wyraźnie mi zaprzeczyć. Chcę złapać wszystkich tych błędów, więc mogę analizować je do odpowiednich informacji, więc moje przeczucie mówi mi, aby użyć try / catch.

Normalnie użyć try / catch do komunikatów o błędach przechowywać w zewnętrznej pętli gdzieś pętli, i to działa świetnie. Ale w rzeczywistości nie mieć pętlę, aby kontynuować. Nie wiem co teraz zrobić. Oto kod źródłowy mam.

function Get-FileInfo {
    Param(
        [Parameter(Mandatory=$True,Position=0)]
        [ValidateNotNull()]
        [string]$path
    )

    $global:errorInfo = @()
    Write-Host I started!

    Try {
        Write-Host I started the Try Statement!
        $fileInfo = Get-ChildItem $path -Recurse -ErrorAction Stop
        Write-Host I finished the main pull!
        Return $fileInfo
    }

    Catch {
        Write-Host I started the Catch Statement!
        $errorObj = New-Object PSObject
        Add-Member -inputObject $errorObj -memberType NoteProperty -name “Type” -value $_.Exception.Message
        Add-Member -inputObject $errorObj -memberType NoteProperty -name “Item” -value $_.Exception.ItemName
        $errorInfo += $errorObj
        Continue
    }

}

Jestem pewien, że widzisz problem. Chcę uchwycić błędy, które nieuchronnie występują w bloku try, ale w rzeczywistości nie ma pętli. I naprawdę nie zobaczyć, jak to ustawić jako pętla Żeby było lepiej.

Jeśli uruchomić ten kod, to napisać „I Started!” a następnie „Zacząłem instrukcji try” niemal natychmiast po tym. Wtedy to będzie działać przez około minutę. Potem dostać „Zacząłem catch!” i natychmiast się kończy. To ma sens, dlaczego tak się dzieje, ale nie jest to oczywiście zamierzony rezultat.

Ja na samą myśl o tym złego?

Utwórz 03/12/2019 o 00:06
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Błędy jesteś opisujące to niekończący błędy, które można zebrać w zmiennej ze wspólnym -ErrorVariableparametrem , bez zatrzymywania się na polecenie pierwszego błędu (co właśnie -ErrorAction Stoprobi).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Uwaga jak nazwa zmiennej docelowej errsmusi być określona bez$ , ponieważ jesteś przechodzącą zmiennej za nazwę , a nie jej wartość. $errsjest tworzona jako lokalnej zmiennej.

    • Jest to generalnie lepiej unikać ustawiania zmiennych całej granice zakresu, ale jest możliwe, aby kierować zmienną w skrypt / zakres globalny zakres zamiast, a mianowicie z
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Również wyciszyć błędy, zastosowanie -ErrorAction SilentlyContinue, nie -ErrorAction Ignore- to ostatnie byłoby całkowicie stłumić błędów, dzięki czemu $errspusta.

Odpowiedział 03/12/2019 o 00:27
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more