Poursuivre l'exécution sur une Exception
Ci-dessous le script je veux exécuter. La question ici est de une fois une exception se produit, il s'arrête en cours d'exécution, j'ai utilisé continue
dans le bloc catch mais cela ne fonctionne pas. Comment puis-je le faire fonctionner, même après qu'une exception se produit, elle doit être mise en boucle dans foreach
.
J'ai aussi utilisé un while($true)
boucle, mais qui est entré dans une boucle infinie. Comment aller à ce sujet?
$ErrorActionPreference = "Stop";
try
{
# Loop through each of the users in the site
foreach($user in $users)
{
# Create an array that will be used to split the user name from the domain/membership provider
$a=@()
$displayname = $user.DisplayName
$userlogin = $user.UserLogin
# Separate the user name from the domain/membership provider
if($userlogin.Contains('\'))
{
$a = $userlogin.split("\")
$username = $a[1]
}
elseif($userlogin.Contains(':'))
{
$a = $userlogin.split(":")
$username = $a[1]
}
# Create the new username based on the given input
$newalias = $newprovider + "\" + $username
if (-not $convert)
{
$answer = Read-Host "Your first user will be changed from $userlogin to $newalias. Would you like to continue processing all users? [Y]es, [N]o"
switch ($answer)
{
"Y" {$convert = $true}
"y" {$convert = $true}
default {exit}
}
}
if(($userlogin -like "$oldprovider*") -and $convert)
{
LogWrite ("Migrating User old : " + $user + " New user : " + $newalias + " ")
move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false
LogWrite ("Done")
}
}
}
catch {
LogWrite ("Caught the exception")
LogWrite ($Error[0].Exception)
}
Aide gentiment.
Pourquoi ne pas changer
Est-t-il une ligne qui est à l'origine de l'exception?
$ErrorActionPreference = "Continue"
? Ne fonctionne pas pour vous?Est-t-il une ligne qui est à l'origine de l'exception?
OriginalL'auteur Ishan | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
Vous utilisez
try {...} catch {...}
quand vous voulez pour gérer les erreurs. Si vous voulez l'ignorer, vous devez définir$ErrorActionPreference = "Continue"
(ou"SilentlyContinue"
) @C. B., ou utilisez le-ErrorAction "SilentlyContinue"
pour l'opération de collecte de l'erreur. Si vous souhaitez gérer les erreurs à partir d'une certaine instruction, vous mettriez que l'instruction dans latry {...} catch {...}
bloc, pas la totalité de la boucle, par exemple:Vous avez besoin
Stop
que l'erreur d'action pourtry..catch
de travail, parce qu'il n'attrape la résiliation des erreurs. Sans une terminaison d'erreur il n'y aurait rien pour attraper en premier lieu.-ErrorAction ne fonctionne pas pour les exceptions. E. g. si vous voulez ignorer l'échec de Set-ExecutionPolicy, la seule façon d'obtenir aucune erreur de sortie est à prendre [...] { }. Remarque vous avez besoin de l'espace, autrement Catch est analysée à rien et qui provoque une erreur!
OriginalL'auteur Ansgar Wiechers
Modifié le code comme ci-dessous. Utilisé le morceau de code suivant après
move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false
$?
. Jamais. Au lieu de vérifier$LastExitCode
(voir ici).N'est-ce pas $LastExitCode pour les exécutables, pas pour les applets de commande PowerShell, des scripts ou des fonctions?
OriginalL'auteur Ishan
Quelque chose qui a fonctionné pour moi est de définir la
$ErrorActionPreference
variable d'arrêter, et puis de le réinitialiser en arrière pour continuer dans le bloc catch:OriginalL'auteur Arthur Strutzenberg