PowerShell: configuración de $ ErrorActionPreference para todo el script

Hoy he estado dando una oportunidad a PowerShell (v3.0) por primera vez, y me frustré enormemente con la extraña forma en que se implementan algunos de sus conceptos de manejo de errores.

Escribí el siguiente fragmento de código (usando el módulo PowerShell de registro remoto)

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 $_
}

(Esto es sólo un fragmento)

Al parecer, el comportamiento predeterminado de PowerShell es NO detectar errores que no terminen. Así que agregué la siguiente línea en la parte superior de mi script, según lo recomendado por varias personas:

$ErrorActionPreference = "Stop"

Ejecutar esto en el PowerShell ISE efectivamente atrapó todos los errores. Sin embargo, la ejecución después del comando desde el terminal todavía no detecta mis errores.

Desde el 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.

Desde la línea de comandos:

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

No tengo idea de por qué el comportamiento de las Variables de Preferencia se comporta de manera diferente dependiendo de dónde se llaman, especialmente porque el ISE parece ejecutar exactamente el mismo comando.

Basado en otros comentarios, cambié la siguiente línea:

New-RegKey -ComputerName $PCName -Key $Key -Name $Value

A:

New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop

Al usar este método, pude atrapar errores tanto de la línea de comandos como del ISE, pero no quiero especificar el comportamiento de error en cada Cmdlet al que llamo, especialmente porque la captura de errores es esencial para el correcto funcionamiento de el código. (Además, el hecho de que este método SÍ funcione solo sirve para confundirme aún más)

¿Cuál es la forma correcta de definir el comportamiento de manejo de errores para el alcance de un script y / o módulo completo?

Además, aquí está mi $ 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

Respuestas a la pregunta(1)

Su respuesta a la pregunta