PowerShell - ustawienie $ ErrorActionPreference dla całego skryptu
Po raz pierwszy udostępniam PowerShell (v3.0) po raz pierwszy i stałam się niezmiernie sfrustrowana dziwnym sposobem implementacji niektórych z jego koncepcji obsługi błędów.
Napisałem następujący fragment kodu (używając modułu Remote Registry PowerShell)
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 $_
}
(To tylko fragment)
Najwyraźniej domyślnym zachowaniem PowerShell jest NIE łapanie błędów, które nie kończą się. Dodałem następujący wiersz na górze mojego skryptu, zgodnie z zaleceniami różnych osób:
$ErrorActionPreference = "Stop"
Wykonanie tego w PowerShell ISE rzeczywiście wykryło wszystkie błędy. Jednak wykonanie następującego polecenia z terminala nadal nie przechwytuje moich błędów.
Z 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.
Z linii poleceń:
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
Nie mam pojęcia, dlaczego zachowanie zmiennych preferencji zachowuje się inaczej w zależności od tego, skąd są wywoływane, zwłaszcza że ISE wydaje się wykonywać dokładnie to samo polecenie?
W oparciu o inne opinie zmieniłem następujący wiersz:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
Do:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop
Korzystając z tej metody, udało mi się przechwycić błędy zarówno z wiersza poleceń, jak i ISE, ale nie chcę określać zachowania błędu w każdym wywołaniu Cmdlet I, zwłaszcza, że łapanie błędów jest niezbędne do prawidłowego funkcjonowania kod. (Plus fakt, że ta metoda działa tylko po to, aby mnie jeszcze bardziej zmylić)
Jaki jest właściwy sposób definiowania zachowania związanego z obsługą błędów dla całego skryptu i / lub modułu?
Również tutaj jest moja $ 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