7
votes

Continuer l'exécution à l'exception

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é 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>.

J'ai également utilisé un 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)
} 


2 commentaires

Pourquoi ne pas changer $ erroractionpreference = "continuer" ? Ne fonctionne pas pour vous?


Y a-t-il une ligne spécifique qui cause-t-elle l'exception?


4 Réponses :


9
votes

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)
  }
} 


3 commentaires

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 comme action d'erreur pour essayer..catch 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!



0
votes

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 ("  ")
}


2 commentaires

N'utilisez pas $? . Jamais. Au lieu de cela, vérifiez plutôt $ lastexitCode (voir ici ).


N'EST-IL N'EST-ILLEXITECODE POUR LES EXECUTABLES, NON PAS POUR POWERSHELL CMDLETLETS, Scripts ou Fonctions?



0
votes

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;


0 commentaires

1
votes

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


2 commentaires

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.