PowerShell: erros de captura, mas continuar sem loop?

votos
0

Eu gosto de pensar que sou bom bonito com PowerShell, mas eu sou um pouco perplexo aqui.

Eu tenho uma lista gigantesca de arquivos que eu estou indo para executar esse código em que vai me dar algumas informações do arquivo necessário que eu vou correr analytics diante. O primeiro passo é apenas começando a lista de arquivos. Então eu corro isso.

Get-ChildItem $path -Recurse

Isso retorna um monte de informações inúteis, mas também me dá um mar de vermelho. Há toneladas de arquivos e pastas que não podem ser encontrados e explicitamente me negar. Eu quero pegar todos esses erros para que eu possa analisá-los a informações relevantes, de modo que o meu instinto me diz para usar try / catch.

Normalmente você usar try / catch para armazenar mensagens de erro dentro de um fora de loop em algum lugar do loop, e que funciona muito bem. Mas eu realmente não tem um loop para continuar. Eu não tenho certeza o que fazer agora. Aqui está o código fonte que eu tenho.

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
    }

}

Tenho certeza que você vê a questão. Eu quero capturar os erros que inevitavelmente ocorrem dentro do bloco Try, mas eu realmente não tem um loop. Eu realmente não ver como configurá-lo como um loop para fazer as coisas melhor.

Se eu executar esse código, ele vai escrever I Started! e, em seguida, Eu comecei a try quase imediatamente depois disso. Em seguida, ele irá trabalhar para cerca de um minuto. Então eu recebo um Comecei a instrução Catch! e imediatamente termina. Faz sentido por que isso acontece, mas isso não é obviamente o resultado pretendido.

Estou apenas pensando sobre isso errado?

Publicado 03/12/2019 em 00:06
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Os erros que você está descrevendo são não-encerramento erros, que você pode coletar em uma variável com o comum -ErrorVariableparâmetro , sem parar o comando no primeiro erro (que é o que -ErrorAction Stopfaz).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Observe como o nome da variável-alvo, errsdeve ser especificado sem a$ , uma vez que você está passando da variável nome , não o seu valor. $errsé criado como um local de variável.

    • Em geral, é melhor evitar a definição de variáveis através de limites de escopo, mas é possível atingir uma variável no script de escopo / mundial âmbito vez, ou seja, com
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Para também silenciar os erros, uso -ErrorAction SilentlyContinue, não -ErrorAction Ignore- este último seria suprimir erros completamente, tornando $errsvazio.

Respondeu 03/12/2019 em 00:27
fonte usuário

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