私は今日初めてPowerShell(v3.0)を試してみましたが、エラー処理の概念のいくつかが実装されている奇妙な方法に非常に不満を感じていました。
次のコードを作成しました(リモートレジストリ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 $_
}
(これは単なるスニペットです)
どうやら、PowerShellのデフォルトの動作は、終了しないエラーをキャッチしないことです。そこで、さまざまな人から推奨されているように、スクリプトの上部に次の行を追加しました。
$ErrorActionPreference = "Stop"
PowerShell ISEでこれを実行すると、実際にすべてのエラーが検出されました。ただし、ターミナルからのコマンドに続いて実行しても、エラーは検出されません。
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.
コマンドラインから:
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
特にISEがまったく同じコマンドを実行しているように見えるため、優先変数の動作が呼び出し元によって異なる動作をする理由がわかりません。
他のフィードバックに基づいて、次の行を変更しました。
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
に:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop
この方法を使用すると、コマンドラインとISEの両方からエラーをトラップできましたが、特にエラーのキャッチが適切に機能するために不可欠であるため、呼び出す各コマンドレットでエラーの動作を指定したくありません。コード。 (さらに、この方法が機能するという事実は、私をさらに混乱させるだけです)
スクリプトやモジュール全体のスコープのエラー処理動作を定義する適切な方法は何ですか?
また、これが私の$ 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
V3を実行しているため、$ PSDefaultParameterValuesを使用するオプションもあります。
$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}
通常、それはグローバルスコープでそれを変更します。ローカルスコープまたはスクリプトスコープのみに分離する場合は、最初にローカルスコープで新しいスコープを初期化できます。
$PSDefaultParameterValues = @{}
$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}
親スコープにすでにあるものを継承してから、ローカルスコープ用に追加する場合:
$PSDefaultParameterValues = $PSDefaultParameterValues.clone()
$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}
New-RegKeyだけでなく、すべてのコマンドレットにデフォルトのErrorActionを設定するには、上記のコードで'*:ErrorAction'
の代わりに'New-RegKey:ErrorAction'
を指定します。