2017-10-26 18 views
0

私はいくつかのサービス情報を調べようとしています。アプリケーションのインストーラが正しくインストールされないことがあるため、レジストリにサービスエントリが含まれていないことがあります。私は、インストーラで適切なロギングをしていないシステムであっても、どのインストーラのステップが正しく実行されたかを知りたい。なぜ例外がキャッチブロックに入らないのですか?

try { 
    $path = 'hklm:\SYSTEM\CurrentControlSet\services\MyService' 
    $key = Get-Item $path 
    $namevalues = $key | Select-Object -ExpandProperty Property | 
     ForEach-Object { 
     [PSCustomObject] @{ 
      Name = $_; 
      Value = $key.GetValue($_) 
     } 
    } 
    $namevalues | Format-Table 
} 
catch { 
    $ProgramFilesX86 = [System.Environment]::GetFolderPath("ProgramFilesX86"); 
    $ProgramFiles = [System.Environment]::GetFolderPath("ProgramFiles"); 
    Write-Host $ProgramFilesX86 
    Write-Host $ProgramFiles 
} 

はなぜそれであるとどのように私は終了することを強制する必要があります:MyServiceが存在しない場合はexception handling documentationが裸catchが十分でなければなりません示唆していても

、スクリプトは以下catchブロックに行きませんcatch

これは何PowerShellの出力です:

Get-Item : Cannot find path 'HKLM:\SYSTEM\CurrentControlSet\services\MyService' because it does not exist. 
At C:\Users\Developer\...\GetMyServiceInfo.ps1:17 char:12 
+  $key = Get-Item $path 
+   ~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (HKLM:\SYSTEM\Cu...vices\MyService:String) [Get-Item], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand 

答えて

5

が終了されるエラーを強制:

$key = Get-Item $path -ErrorAction Stop 

それがスローされますとキャッチはそれを取得しますその方法を。

説明と公式Microsoftのドキュメントへのリンク:

  • -ErrorActionは、任意のPowerShellコマンドに適用することができCommon Parameterある
  • -ErrorActionのデフォルト値がでスローされる例外を防止Continueです最初の場所。
  • Preference Variableという名前の$ErrorActionPreferenceを使用してグローバルの-ErrorAction設定を構成して、このデフォルト値を上書きすることができます。
+0

ありがとうございます。 '-ErrorAction'と' $ ErrorActionPreference'ドキュメントへのリンクをいくつか追加してください。それから私は答えを受け入れます。 –

+2

[about_CommonParameters](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_commonparameters?view=powershell-5.1) – Manu

関連する問題