PowerShell: chytit chyby, ale i nadále bez smyčky?

hlasů
0

Rád si myslím, že jsem docela dobře s PowerShell, ale jsem trochu tu pařezy.

Mám obří seznam souborů, které budu spustit tento kód, který mi dá nějaké potřebné informace o souborech, které budu běžet analytické dál. Krok číslo jedna je právě získání seznamu souborů. Tak běžím to.

Get-ChildItem $path -Recurse

To vrátí spoustu zbytečných informací, ale také mi dává moře červené. Je tu spoustu souborů a složek, které nelze nalézt a výslovně mě popřít. Chci zachytit všechny tyto chyby, takže můžu analyzovat je dolů k relevantním informacím, takže moje intuice mi říká, použít try / catch.

Za normálních okolností použít try / catch k chybám úložiště zpráv v rámci smyčky někde mimo smyčky, a to funguje skvěle. Ale nemyslím si, ve skutečnosti mají smyčku pokračovat. Nejsem si jistý, co má dělat. Zde je zdrojový kód mám.

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
    }

}

Jsem si jistý, vidíte problém. Chci zachytit chyby, které se nevyhnutelně vyskytují v rámci bloku try, ale nemám ve skutečnosti mají smyčku. Opravdu nevím, jak toto nastavení jako smyčka, aby se věci lépe.

Mám-li spustit tento kód, bude psát „I Started!“ a pak „Začal jsem Příkaz try“ téměř okamžitě po tom. Pak to bude fungovat po dobu asi jedné minuty. Pak jsem se dostat „Začal jsem příkaz chytit!“ a to okamžitě končí. To dává smysl, proč se to stane, ale to samozřejmě není zamýšlený výsledek.

Jsem jen přemýšlet o tom špatného?

Položena 03/12/2019 v 00:06
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Chyby jste popisující jsou non-zakončovací chyby, které můžete sbírat v proměnné se společným -ErrorVariableparametrem , bez zastavení příkazu na první chybě (což je to, co -ErrorAction Stopdělá).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Všimněte si, že název cílové proměnná, errsmusí být zadán bez$ , protože jste předávání proměnné jméno , nikoliv její hodnotu. $errsje vytvořen jako lokální proměnné.

    • To je obecně lepší, aby se zabránilo nastavení proměnných napříč hranicemi působnosti, ale to je možné cílit na proměnnou v script rozsahu / globální působnosti místo, a to s
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Také umlčet chyby, používání -ErrorAction SilentlyContinue, ne -ErrorAction Ignore- za druhé by potlačit chyby dohromady, takže $errsprázdná.

Odpovězeno 03/12/2019 v 00:27
zdroj uživatelem

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