Try/catch ne semble pas avoir un effet
Je suis nouveau sur powershell, et je suis en train d'ajouter la gestion des erreurs via les instructions try/catch, mais ils ne semblent pas être réellement la capture de l'erreur. C'est powershell v2 CP3.
$objComputer = $objResult.Properties;
$strComputerName = $objComputer.name
write-host "Checking machine: " $strComputerName
try
{
$colItems = get-wmiobject -class "Win32_PhysicalMemory" -namespace "root\CIMV2" -computername $strComputerName -Credential $credentials
foreach ($objItem in $colItems)
{
write-host "Bank Label: " $objItem.BankLabel
write-host "Capacity: " ($objItem.Capacity / 1024 / 1024)
write-host "Caption: " $objItem.Caption
write-host "Creation Class Name: " $objItem.CreationClassName
write-host
}
}
Catch
{
write-host "Failed to get data from machine (Error:" $_.Exception.Message ")"
write-host
}
finally
{ }
Quand il ne parvient pas à communiquer avec une machine spécifique, j'obtiens ceci dans la console, et non de ma propre attraper message:
Get-WmiObject : The RPC server is
unavailable. (Exception from HRESULT:
0x800706BA) At Z:\7.0 Intern
Programvare\Powershell\Get memory of
all computers in AD.ps1:25 char:34
+ $colItems = get-wmiobject <<<< -class "Win32_PhysicalMemory"
-namespace "root\CIMV2" -computername $strComputerName -Credential
$credentials
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject],
COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de reproduire votre résultat lorsque vous essayez d'exécuter une requête WMI à distance. L'exception n'est pas interceptée par le Try/Catch, ni un Piège, l'attraper, car il n'est pas une "terminaison d'erreur". Dans PowerShell, il y a de terminaison d'erreurs et de non-terminaison des erreurs . Il semble que les Try/Catch/finally et le Piège ne fonctionne qu'à la fin des erreurs.
Il est connecté à l' $erreur variable automatique et vous pouvez tester ce type de non-terminaison des erreurs en regardant le $? variable automatique, ce qui vous permettra de savoir si la dernière opération a réussi ($true) ou d'échec ($false).
À partir de l'apparition de l'erreur générée, il semble que l'erreur est retourné et non enveloppé dans un catchable exception. Ci-dessous est une trace de l'erreur générée.
Un travail autour de votre code pourrait être:
$error.Clear()
$Error[0]
tellement. Si vous utilisez$_
dans un catch vous éviter d'avoir à effacer le message d'erreur de cache et le risque de déclarer une erreur s'est produite dans la capture elle-même.Si vous voulez try/catch de travail pour toutes les erreurs (et pas seulement la résiliation des erreurs), vous pouvez effectuer manuellement toutes les erreurs de résiliation par le réglage de la ErrorActionPreference.
Sinon... vous pouvez faire votre propre trycatch fonction qui accepte scriptblocks de sorte que votre essayez d'attraper les appels ne sont pas comme quelque chose. J'ai la mienne retourner true/false juste au cas où j'ai besoin de vérifier si il y avait une erreur... mais il ne marche pas avoir à le faire. Aussi, enregistrement d'exception est optionnel et peut être pris en charge dans le catch, mais je me suis toujours à l'appel de la fonction d'enregistrement dans le bloc catch, donc je l'ai ajouté à la try catch fonction.
Il est également possible de définir l'erreur de l'action de préférence individuelle des applets de commande, et pas seulement pour l'ensemble du script. Ceci est fait en utilisant le paramètre-ErrorAction (alisa EA), qui est disponible sur toutes les applets de commande.
Exemple
C'est ma solution. Lors de la Set-location échoue il jette à un non-terminaison d'erreur qui n'est pas vu par le bloc catch. L'ajout d'-ErrorAction Arrêt de la façon la plus simple de contourner cette.
Ajoutant "-EA Arrêter" résolu pour moi.
Edit: Comme indiqué dans les commentaires, la solution suivante s'applique à PowerShell V1 uniquement.
Voir ce blog sur les Techniques", les Aventures d'Adam Weigert" pour plus de détails sur la façon de le mettre en œuvre.
Exemple d'utilisation (copier/coller à partir d'Adam Weigert blog):
Sinon, vous devrez utiliser d'interception des exceptions.
Dans mon cas, c'était parce que j'étais seulement la capture de certains types d'exceptions:
Ajoutés à la poignée supplémentaire à l'exception provoquant la résiliation de l'erreur, ainsi que les exceptions inattendues