PowerShell - Festlegen von $ ErrorActionPreference für das gesamte Skript
Ich habe PowerShell (v3.0) heute zum ersten Mal getestet und war sehr frustriert über die seltsame Art und Weise, in der einige seiner Fehlerbehandlungskonzepte implementiert wurden.
Ich habe den folgenden Code geschrieben (mithilfe des PowerShell-Moduls für die Remoteregistrierung)
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 $_
}
(Dies ist nur ein Ausschnitt)
Offensichtlich besteht das Standardverhalten von PowerShell darin, KEINE nicht terminierenden Fehler abzufangen. Also habe ich die folgende Zeile oben in mein Skript eingefügt, wie von verschiedenen Leuten empfohlen:
$ErrorActionPreference = "Stop"
Die Ausführung in der PowerShell ISE hat in der Tat alle Fehler aufgefangen. Die Ausführung nach dem Befehl vom Terminal fängt meine Fehler jedoch immer noch nicht ab.
Vom ISE:
PS C:\windows\system32> C:\Data\Scripts\PowerShell\Error.ps1
Errorhandling: Stop
SOFTWARE\MySoftware does not exist. Attempting to create
Unable to create RegKey: SOFTWARE\MySoftware
Key 'SOFTWARE\MySoftware' doesn't exist.
Über die Befehlszeile:
PS C:\Data\Scripts\PowerShell> .\Error.ps1
Errorhandling: Stop
SOFTWARE\MySoftware does not exist. Attempting to create
New-RegKey : Key 'SOFTWARE\MySoftware' doesn't exist.
At C:\Data\Scripts\PowerShell\Error.ps1:17 char:13
+ New-RegKey -ComputerName $PCName -Key $Key -Name $Value
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,New-RegKey
SOFTWARE\MySoftware: created
Ich habe keine Ahnung, warum sich das Verhalten der Präferenzvariablen je nach Aufruf unterschiedlich verhält, zumal die ISE anscheinend genau den gleichen Befehl ausführt.
Aufgrund anderer Rückmeldungen habe ich die folgende Zeile geändert:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
Zu:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop
Mit dieser Methode konnte ich Fehler sowohl von der Befehlszeile als auch von der ISE abfangen, ich möchte jedoch nicht das Fehlerverhalten für jedes aufgerufene Cmdlet angeben, insbesondere, weil das Abfangen von Fehlern für das ordnungsgemäße Funktionieren von wichtig ist der Code. (Außerdem verwirrt mich die Tatsache, dass diese Methode nur funktioniert, noch mehr.)
Wie kann das Fehlerbehandlungsverhalten für den Bereich eines gesamten Skripts und / oder Moduls definiert werden?
Hier ist auch meine $ PSVersionTable:
PS C:\Data\Scripts\PowerShell> $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