Powershell: Fangst feil, men fortsette uten loop?

stemmer
0

Jeg liker å tro at jeg er ganske flink med Powershell, men jeg er litt stumped her.

Jeg har en gigantisk liste over filer som jeg kommer til å kjøre denne koden på som vil gi meg noen nødvendige filinformasjon at jeg skal kjøre analyser på. Trinn en er bare å få fillisten. Så jeg kjører dette.

Get-ChildItem $path -Recurse

Dette returnerer en haug med unyttig informasjon, men det gir meg også et hav av rødt. Det er tonnevis av filer og mapper som ikke kan bli funnet og eksplisitt nekte meg. Jeg ønsker å fange alle disse feilene slik at jeg kan analysere dem ned til relevant informasjon, så min magefølelse sier meg å bruke Try / Catch.

Normalt bruker Prøv / fangst til butikk feilmeldinger i en sløyfe eller annet sted utenfor loop, og det fungerer bra. Men jeg har ikke egentlig har en løkke for å fortsette videre. Jeg er ikke sikker på hva jeg skal gjøre nå. Her er kildekoden jeg har.

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
    }

}

Jeg er sikker på at du ser problemet. Jeg ønsker å fange opp de feilene som nødvendigvis vil oppstå i Try blokken, men jeg trenger faktisk ikke en loop. Jeg vet egentlig ikke hvordan å sette dette opp som en sløyfe for å gjøre ting bedre.

Hvis jeg kjører denne koden, vil det skrive Jeg startet! og deretter Jeg begynte Try Statement nesten umiddelbart etterpå. Da vil det fungere for omtrent et minutt. Så får jeg en jeg startet Catch uttalelse! og det ender umiddelbart. Det er fornuftig hvorfor det skjer, men det er åpenbart ikke ønsket resultat.

Er jeg bare tenkte på dette galt?

Publisert på 03/12/2019 klokken 00:06
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Feilene du beskriver er ikke-terminer feil, som du kan samle i en variabel med felles -ErrorVariableparameter , uten å stoppe kommandoen på den første feil (som er det -ErrorAction Stopgjør).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Legg merke til hvordan målet variabelnavnet, errsmå spesifiseres uten$ , siden du passerer variabelens navn , ikke dens verdi. $errser opprettet som en lokal variabel.

    • Det er som regel bedre å unngå å sette variabler over omfang grenser, men det er mulig å målrette en variabel i skriptet omfang / global omfang i stedet, nemlig med
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Til også slå feil, bruk -ErrorAction SilentlyContinue, ikke -ErrorAction Ignore- det sistnevnte ville undertrykke feil fullstendig, noe som gjør $errstom.

Svarte 03/12/2019 kl. 00:27
kilden bruker

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