PowerShell-Setting $ErrorActionPreference pour l'ensemble du script
J'ai donné PowerShell (v3.0) un coup de feu pour la première fois aujourd'hui, et est devenu énormément frustré par la façon étrange de certains de ses concepts de gestion des erreurs sont mis en œuvre.
j'ai écrit le morceau de code suivant (en utilisant le Module PowerShell de Registre à distance)
try
{
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
Write-Host -fore Green ($Key + ": created")
}
catch
{
Write-Host -fore Red "Unable to create RegKey: " $Key
Write-Host -fore Red $_
}
(ce n'est qu'un extrait)
apparemment le comportement par défaut de PowerShell est de ne pas attraper les erreurs qui ne sont pas terminantes. J'Ai Donc ajouté la ligne suivante au début de mon script, comme recommandé par diverses personnes:
$ErrorActionPreference = "Stop"
L'exécution de ceci dans la PowerShell ISE a effectivement capté toutes les erreurs. Cependant, l'exécution suivant la commande du terminal ne capte toujours pas mes erreurs.
De l'ISE:
PS C:windowssystem32> C:DataScriptsPowerShellError.ps1
Errorhandling: Stop
SOFTWAREMySoftware does not exist. Attempting to create
Unable to create RegKey: SOFTWAREMySoftware
Key 'SOFTWAREMySoftware' doesn't exist.
À Partir De La Ligne De Commande:
PS C:DataScriptsPowerShell> .Error.ps1
Errorhandling: Stop
SOFTWAREMySoftware does not exist. Attempting to create
New-RegKey : Key 'SOFTWAREMySoftware' doesn't exist.
At C:DataScriptsPowerShellError.ps1:17 char:13
+ New-RegKey -ComputerName $PCName -Key $Key -Name $Value
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,New-RegKey
SOFTWAREMySoftware: created
je n'ai aucune idée pourquoi le le comportement des Variables de préférence se comporte différemment selon l'endroit d'où elles sont appelées, d'autant plus que L'ISE semble exécuter exactement la même commande?
basé sur d'autres commentaires, j'ai changé la ligne suivante:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
à:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop
grâce à cette méthode, j'ai pu détecter les erreurs de la ligne de commande et de L'ISE, mais je ne veux pas spécifier le comportement d'erreur sur chaque Cmdlet que j'appelle, d'autant plus que la détection des erreurs est essentielle au bon fonctionnement du code. (De plus, le fait que cette méthode fonctionne ne fait que me déconcerter encore plus)
Quelle est la bonne façon de définir le comportement de gestion des erreurs pour la portée d'un script et/ou d'un module entier?
aussi, Voici mon $ PSVersionTable:
PS C:DataScriptsPowerShell> $PSVersionTable
Name Value
---- -----
PSVersion 3.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18408
BuildVersion 6.2.9200.16481
PSCompatibleVersions {1.0, 2.0, 3.0}
PSRemotingProtocolVersion 2.2
1 réponses
puisque vous utilisez V3, vous avez aussi l'option d'utiliser $PSDefaultParameterValues:
$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}
Normalement qui va changer dans la portée globale. Si vous voulez l'isoler du scope local ou du script, vous pouvez en initialiser un nouveau dans le scope local en premier:
$PSDefaultParameterValues = @{}
$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}
si vous voulez hériter ce qui est déjà dans le champ d'application parent et ensuite l'Ajouter pour le champ d'application local:
$PSDefaultParameterValues = $PSDefaultParameterValues.clone()
$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}
à régler L'ErrorAction par défaut pour tous les cmdlets, pas seulement New-RegKey, spécifie '*:ErrorAction'
au lieu de 'New-RegKey:ErrorAction'
dans le code ci-dessus.