Powershell: Catch Fehler aber weiterhin ohne Schleife?

stimmen
0

Ich mag zu denken, ich bin ziemlich gut mit Powershell, aber ich bin ein bisschen hier stapfte.

Ich habe eine RIESIGE Liste der Dateien, die ich diesen Code ausführen werde auf, dass mir einige notwendige Dateiinformationen geben, dass ich laufen werde Analysen auf. Schritt eins wird immer nur die Dateiliste. So laufe ich dies.

Get-ChildItem $path -Recurse

Dies gibt eine Reihe von nutzlosen Informationen, aber es gibt mir auch ein Meer von rot. Es gibt Tonnen von Dateien und Ordnern, die nicht gefunden werden kann, und leugnen mich ausdrücklich. Ich möchte alle diese Fehler fangen, damit ich sie nach unten zu relevanten Informationen analysieren kann, so mein Bauchgefühl sagt mir Try / Catch zu verwenden.

Normalerweise verwenden Sie Try / Catch zum Speichern von Fehlermeldungen innerhalb einer Schleife irgendwo außerhalb der Schleife, und das funktioniert super. Aber ich habe nicht wirklich eine Schleife weiter auf. Ich bin nicht sicher, was jetzt zu tun. Hier ist der Quellcode ich habe.

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
    }

}

Ich bin sicher, dass Sie das Problem sehen. Ich möchte die Fehler erfassen, die unweigerlich im Try-Block auftreten wird, aber ich weiß nicht wirklich eine Schleife haben. Ich sehe wirklich nicht, wie dies als eine Schleife einzurichten, um die Dinge besser zu machen.

Wenn ich diesen Code ausführen, wird es schreiben „I Started!“ und dann „Ich begann die try-Anweisung“ fast sofort danach. Dann wird es für etwa eine Minute arbeiten. Dann bekomme ich ein „Ich habe die Catch-Anweisung begonnen!“ und es sofort beendet. Es macht Sinn, warum das passiert, aber das ist natürlich nicht das gewünschte Ergebnis.

Denke ich nur über das falsch?

Veröffentlicht am 03/12/2019 um 00:06
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Die Fehler Sie beschreiben , sind nicht abbrechenden Fehler, die Sie in einer Variablen mit dem Sammeln gemeinsamen -ErrorVariableParameter , ohne den Befehl auf den ersten Fehler zu stoppen (das ist , was der -ErrorAction StopFall ist).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Beachten Sie, wie die Zielvariablennamen, errsmuss angegeben werden , ohne die$ , da Sie die Variablen vorbei Namen , nicht ihren Wert. $errswird als erstellt lokale Variable.

    • Es ist im Allgemeinen besser zu vermeiden Variablen über Umfang Grenzen zu setzen, aber es ist möglich , eine Variable in dem Ziel Skript Umfang / global statt Umfang, nämlich mit
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Um auch zum Schweigen bringen , die Fehler, die Verwendung -ErrorAction SilentlyContinuenicht -ErrorAction Ignore- letzteres würde Fehler gänzlich unterdrücken, so dass $errsleer.

Beantwortet am 03/12/2019 um 00:27
quelle vom benutzer

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