3 votes

PowerShell : vérification des erreurs dans une boucle while true ?

J'ai un while($true) avec un start-sleep -s 60 à la fin de celui-ci. L'objectif est de lancer un script. en tant qu'utilisateur différent qui parcourt une liste de serveurs, vérifie le journal des événements pour détecter les changements survenus au cours de la dernière minute et réagit en conséquence.

Puisque ma boucle while (ci-dessous) utilise la fonction -credential pour exécuter le script en tant que quelqu'un d'autre, je suis préoccupé par les erreurs (par exemple, compte bloqué, mot de passe expiré, fichier manquant, etc).

J'ai essayé un if ($error) et modifié le nom de fichier du script externe, mais je n'ai jamais été alerté. Je pense que c'est parce qu'il ne s'arrête jamais pour se revérifier ?

while($true) { 

    # Start the scan
    Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1'

    # Sleep 60 seconds
    start-sleep -s 60

}

Je suppose que je pourrais modifier ma tâche programmée pour qu'elle s'exécute toutes les minutes, mais jusqu'à présent, cette boucle semble fonctionner à merveille. Je voudrais juste introduire un contrôle d'erreur pendant que la boucle est active.

3voto

Frode F. Points 12953

Avez-vous essayé les blocs try/catch ? Des informations d'identification erronées constituent une erreur terminale, de sorte que le reste du code dans le bloc try ne s'exécutera pas après une erreur d'identification. Lorsque vous l'attrapez, vous pouvez faire ce que vous voulez. Ex.

try { 
    Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1'
} catch {
    #Catches terminating exceptions and display it's message
    Write-Error $_.message
}

Si vous souhaitez récupérer toutes les erreurs, ajoutez -ErrorAction Stop à la Start-Process ligne. Comme nous l'avons dit, les références devraient être une erreur de fin, ce qui fait que l'élément erroraction paramètre inutile

EDIT Pourquoi utiliser Start-Process pour exécuter un script en premier lieu ? Je l'ai remplacé par Invoke-Command qui exécute un script powershell script à distance. Si le fichier de script est manquant, vous recevrez une erreur NON terminale. Comme il s'agit d'une erreur non terminale, nous devons utiliser la fonction -ErrorAction Stop paramètre. Pour détecter l'erreur de fichier manquant et toutes les autres erreurs (comme les informations d'identification), utilisez quelque chose comme ceci :

try { Invoke-Command -ScriptBlock { & c:\batch\02-Scan.ps1 } -ErrorAction Stop
} catch {
    if ($_.Exception.GetType().Name -eq "CommandNotFoundException") {
        Write-Error "File is missing"
    } else {
        Write-Error "Something went wrong. Errormessage: $_"
        #or throw it directly:
        #throw $_
    }
}

0voto

mjolinor Points 23012

Peut-être ?

while($true) { 

# Start the scan
try{
Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1' -ErrorAction Stop
}
  catch {
          send-alert
          break
          }

# Sleep 60 seconds
start-sleep -s 60
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X