PowerShell: Catch fouten, maar verder zonder lus?

stemmen
0

Ik denk dat ik ben er vrij goed met PowerShell, maar ik ben een beetje hier stumped.

Ik heb een GIANT lijst met bestanden die ik ga deze code uit te voeren op die me een aantal noodzakelijke dossier informatie die ik analytics zal draaien op zal geven. Stap één is gewoon het krijgen van de lijst met bestanden. Dus loop ik dit.

Get-ChildItem $path -Recurse

Dit geeft een heleboel nutteloze informatie, maar het geeft me ook een zee van rode. Er zijn tal van bestanden en mappen die niet kan worden gevonden en expliciet ontkennen me. Ik wil al deze fouten op te vangen, zodat ik ze kan ontleden beneden tot relevante informatie, dus mijn buikgevoel vertelt me ​​om te proberen / Catch gebruiken.

Normaal gesproken gebruikt u try / catch voor het opslaan van foutmeldingen binnen een lus ergens buiten de lus, en dat werkt geweldig. Maar ik heb niet echt een lus om door te gaan. Ik weet niet zeker wat nu te doen. Hier is de broncode die ik heb.

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
    }

}

Ik weet zeker dat het probleem zie je. Ik wil de fouten die onvermijdelijk zal plaatsvinden binnen het blok try te vangen, maar ik heb niet echt een lus. Ik zie niet echt hoe dit opgezet als een lus om dingen te verbeteren.

Als ik deze code uitvoert, zal het te schrijven Ik ben begonnen! en dan ik begonnen met de try-statement vrijwel direct na dat. Dan zal het werken voor ongeveer een minuut. Dan krijg ik een Ik begon de catch-statement! en eindigt onmiddellijk. Het is logisch waarom dat gebeurt, maar dat is natuurlijk niet het beoogde resultaat.

Ben ik net te denken over dit verkeerd?

De vraag is gesteld op 03/12/2019 om 00:06
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

De fouten die u beschrijft zijn non-beëindigen fouten, die je kunt verzamelen in een variabele met de gemeenschappelijke -ErrorVariableparameter , zonder te stoppen op de opdracht in de eerste fout (dat is wat -ErrorAction Stopdoet).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Merk op hoe de doelvariabele naam, errsmoeten worden opgegeven zonder$ , omdat je van de variabele gaan voorbij naam , niet de waarde ervan. $errswordt gemaakt als een lokale variabele.

    • Het is over het algemeen beter om te voorkomen dat het instellen van variabelen over scope grenzen, maar het is mogelijk om een variabele in het doel script scope / global scope plaats, namelijk met
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Om ook het zwijgen de fouten, gebruik -ErrorAction SilentlyContinue, niet -ErrorAction Ignore- de laatste zou fouten helemaal onderdrukken, zodat dit $errsleeg.

antwoordde op 03/12/2019 om 00:27
bron van user

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