PowerShell: отлавливать ошибки, но по-прежнему без цикла?

голоса
0

Мне нравится думать, что я довольно хорошо с PowerShell, но я немного озадачен здесь.

У меня есть GIANT список файлов, которые я собираюсь запустить этот код на который даст мне необходимую информацию о файле, что я буду работать аналитику на. Шаг один только получение списка файлов. Так что я запускаю это.

Get-ChildItem $path -Recurse

Это возвращает кучу бесполезной информации, но она также дает мне море красного цвета. Там тонны файлов и папок, которые не могут быть найдены и явно не откажи мне. Я хочу, чтобы поймать все эти ошибки, так что я могу разобрать их к соответствующей информации, так что моя интуиция говорит мне, чтобы использовать Try / Catch.

Обычно вы используете Try / Выгоду для сообщений об ошибках магазина в цикле где-то за пределы цикла, и это прекрасно работает. Но я на самом деле не цикл, чтобы продолжать. Я не уверен, что теперь делать. Вот исходный код у меня есть.

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
    }

}

Я уверен, что вы видите проблему. Я хочу, чтобы захватить ошибки, которые неизбежно возникают в блоке Try, но я на самом деле не имею петли. Я не очень понимаю, как установить это как цикл, чтобы сделать вещи лучше.

Если я запускаю этот код, он будет писать «Я начал!» а затем «Я начал заявление Try» почти сразу же после этого. Тогда он будет работать в течение приблизительно минуты. Тогда я получаю «Я начал заявление Лови!» и он сразу же заканчивается. Это имеет смысл, почему это происходит, но это, очевидно, не намеченный результат.

Могу ли я просто думать об этом неправильно?

Задан 03/12/2019 в 00:06
источник пользователем
На других языках...                            


1 ответов

голоса
0

В вы описываете ошибки не-прекращения ошибок, которые вы можете собрать в переменном с общим -ErrorVariableпараметром , без остановки команды на первые ошибках (что -ErrorAction Stopделает).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Обратите внимание , как имя переменной цели, errsдолжно быть указано без$ , так как вы передаете переменное имя , а не его значения. $errsсоздается как локальной переменной.

    • Как правило , лучше , чтобы избежать установок переменных через границу области видимости, но это можно настроить таргетинг на переменной в скрипте Scope / глобальном масштабе вместо этого, а именно с
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Для того, чтобы также заглушить ошибки, использование -ErrorAction SilentlyContinue, а не -ErrorAction Ignore- последний будет подавлять ошибки вообще, делая $errsпустым.

Ответил 03/12/2019 в 00:27
источник пользователем

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