PowerShell: erreurs de capture, mais toujours sans boucle?

voix
0

Je préfère penser que je suis assez bon avec PowerShell, mais je suis un peu perplexe ici.

J'ai une liste GIANT des fichiers que je vais exécuter ce code sur cela me donnera des informations de fichiers nécessaires que je vais courir sur l'analyse. La première étape est qu'obtenir la liste des fichiers. Alors je lance ça.

Get-ChildItem $path -Recurse

Cela renvoie un tas d'informations inutiles, mais il me donne aussi une mer de rouge. Il y a des tonnes de fichiers et de dossiers qui ne peuvent pas être trouvés et ne me laissent pas explicitement. Je veux attraper toutes ces erreurs pour que je puisse les analyser à l'information utile, donc mon sentiment instinct me dit d'utiliser try / catch.

Normalement, vous utilisez try / catch pour stocker les messages d'erreur dans une boucle quelque part en dehors de la boucle, et qui fonctionne très bien. Mais je n'ai pas fait une boucle pour continuer. Je ne sais pas quoi faire maintenant. Voici le code source que j'ai.

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
    }

}

Je suis sûr que vous voyez le problème. Je veux capturer les erreurs qui se produiront inévitablement dans le bloc Try, mais je n'ai pas fait une boucle. Je ne vois pas vraiment comment le mettre en place en boucle pour améliorer les choses.

Si je lance ce code, il écrit « I Started! » puis «J'ai commencé l'instruction Try » presque immédiatement après. Ensuite, il travaillera pendant environ une minute. Puis-je obtenir un «J'ai commencé l'instruction catch! » et il se termine immédiatement. Il est logique pourquoi cela arrive, mais c'est évidemment pas le résultat escompté.

Est-ce que je pense à peu près ce mal?

Créé 03/12/2019 à 00:06
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Les erreurs que vous décrivez sont non-terminaison erreurs, que vous pouvez recueillir dans une variable avec le commun -ErrorVariableparamètre , sans arrêter la commande sur la première erreur (qui est ce -ErrorAction Stopfait).

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
  • Notez que le nom de la variable cible, errsdoit être spécifié sans$ , puisque vous passez de la variable nom , et non pas sa valeur. $errsest créé en tant que locale variable.

    • Il est généralement préférable d'éviter de définir des variables hors des limites de la portée, mais il est possible de cibler une variable dans le scénario portée / global portée à la place, à savoir avec
      -ErrorVariable script:errs/-ErrorVariable global:errs
  • Pour aussi faire taire les erreurs, l' utilisation -ErrorAction SilentlyContinue, non -ErrorAction Ignore- ce dernier supprimerait des erreurs tout à fait, ce qui $errsvide.

Créé 03/12/2019 à 00:27
source utilisateur

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