PowerShell: errori di cattura, ma continuano senza ciclo?

voti
0

Mi piace pensare che sono abbastanza buono con PowerShell, ma io sono un po 'perplesso qui.

Ho una lista GIGANTE di file che ho intenzione di eseguire questo codice su che mi darà alcune informazioni sul file necessario che corro Analytics su. Il primo passo è solo ottenere l'elenco dei file. Così ho eseguito questo.

Get-ChildItem $path -Recurse

Ciò restituisce un po 'di informazioni inutili, ma mi dà anche un mare di rosso. Ci sono tonnellate di file e cartelle che non possono essere trovati ed esplicitamente mi negano. Voglio prendere tutti questi errori in modo da poter analizzare giù alle informazioni pertinenti, quindi il mio istinto mi dice di usare try / catch.

Normalmente si utilizza try / catch per i messaggi di errore negozio all'interno di un ciclo di fuori da qualche parte del ciclo, e che le grandi opere. Ma io in realtà non hanno un ciclo per continuare. Non sono sicuro di cosa fare adesso. Ecco il codice sorgente che ho.

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
    }

}

Sono sicuro che si vede il problema. Voglio catturare gli errori che inevitabilmente si verificano all'interno del blocco try, ma io in realtà non hanno un ciclo. Io non vedo proprio come impostare questo come un ciclo per migliorare le cose.

Se corro questo codice, si scriverà Ho iniziato! e poi ho iniziato il try quasi subito dopo. Poi si lavorerà per circa un minuto. Poi ho un Ho cominciato la dichiarazione Catch! e termina immediatamente. Ha senso perché ciò che accade, ma non è, ovviamente, il risultato previsto.

Sto solo pensando a questo torto?

È pubblicato 03/12/2019 alle 00:06
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Gli errori si sta descrivendo sono non fatale errori, che si possono raccogliere in una variabile con il comune -ErrorVariabledi parametri , senza fermare il comando sul primo errore (che è quello che -ErrorAction Stopfa).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Si noti come il nome della variabile di destinazione, errsdeve essere specificato senza la$ , dal momento che si sta passando della variabile nome , non il suo valore. $errsè stato creato come un locale di variabile.

    • E 'generalmente preferibile evitare di impostare le variabili attraverso i confini di ambito, ma è possibile indirizzare una variabile nella sceneggiatura ambito / globale portata, invece, vale a dire con
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Per anche tacere gli errori, uso -ErrorAction SilentlyContinue, non -ErrorAction Ignore- quest'ultimo sarebbe sopprimere errori del tutto, rendendo $errsvuota.

Risposto il 03/12/2019 a 00:27
fonte dall'utente

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