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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage