ci-dessous est le script que je veux exécuter. Le problème ici est une fois qu'une exception se produit, il arrête d'exécuter, j'ai utilisé J'ai également utilisé un Continuer code> dans le bloc de capture mais qui n'a pas fonctionné. Comment puis-je le faire fonctionner, même après une exception survient, elle devrait boucler dans foreach code>. tandis que ($ true) code> boucle, mais qui est allé dans une boucle infinie . Comment y aller? P> $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)
}
4 Réponses :
Vous utilisez essayer {...} Catch {...} code> Lorsque vous souhaitez gérer les erreurs. Si vous voulez les ignorer, vous devez définir $ erroractionpreference = "continuer" code> (ou "silencieusementContinue" code>) comme @ c.b. suggéré ou utilise -erroraction "silencieuse" code> pour l'opération particulière élever l'erreur. Si vous souhaitez gérer les erreurs d'une certaine instruction, vous mettriez cette instruction dans le essayer {...} Catch {...} code> bloc, pas la boucle entière, par exemple: foreach($user in $users) {
...
try {
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)
}
}
Puisque je voulais enregistrer des erreurs non terminées, régler "$ errorActionPreference" ne m'a pas beaucoup aidé. Seule le temps qu'il a fonctionné est '$ erroractionpreference = "arrêter"' mais que l'exécution s'arrête sur la capture. Je voulais continuer l'exection même sur une erreur. S'il vous plaît voir ma réponse, qui a résolu mon problème. Merci pour votre réponse. :)
Vous avez besoin de stop code> comme action d'erreur pour essayer..catch code> fonctionner, car il n'atteint que des erreurs de terminaison. Sans une erreur de terminaison, il n'y aurait rien à attraper en premier lieu.
-ErrorActive ne fonctionne pas pour des exceptions. Par exemple. Si vous souhaitez ignorer l'échec de Set-ExecuVerpolicy, le seul moyen d'obtenir aucune sortie d'erreur est d'attraper [système ...] {}. Notez que vous avez besoin de l'espace, sinon la capture est analysée à rien et qui provoque une erreur!
modifié le code comme ci-dessous. Utilisé la pièce de code suivante après MOVE-SPUSER -IENTITITY $ UTILISATEUR -NEWALIAS $ NEWALIAS -IGNORESID -CONFIRM: $ FALSE CODE> if($?)
{
LogWrite ("Done!")
LogWrite (" ")
}
else
{
LogWrite ($Error[0].ToString())
LogWrite (" ")
}
N'utilisez pas $? Code>. Jamais. Au lieu de cela, vérifiez plutôt $ lastexitCode code> (voir ici ).
N'EST-IL N'EST-ILLEXITECODE POUR LES EXECUTABLES, NON PAS POUR POWERSHELL CMDLETLETS, Scripts ou Fonctions?
Quelque chose qui a fonctionné pour moi est de définir le $ erroractionPreference CODE> variable pour arrêter, puis le réinitialiser pour continuer dans le bloc de capture: $e = $ErrorActionPreference
$ErrorActionPreference="stop"
try
{
#Do Something that throws the exception
}
catch
{
$ErrorActionPreference=$e
}
$ErrorActionPreference=$e;
Vous semblez avoir placé la "prise" à l'extérieur du corps de la boucle, de sorte qu'Ebort la boucle. Mettre la capture à l'intérieur de la boucle p>
S'il vous plaît encore plus d'explications et de codes, comme cela pourrait aider à la référence future
Dans le code OP, le bloc de capture est situé à l'extérieur de la boucle. Voici un exemple: foreach ($ A in $ list) {essayer {dosomething} write-sortie "yay, j'ai fait quelque chose!" } Catch {Write-Sortie "Uh-Oh. Armageddon." } Lorsque l'exception est attrapée, elle est attrapée en dehors de la boucle.
Pourquoi ne pas changer
$ erroractionpreference = "continuer" code>? Ne fonctionne pas pour vous?Y a-t-il une ligne spécifique qui cause-t-elle l'exception?