

初めての質問で慣れておらず、失礼がありましたら、お許しください。  
タイトルに書いたような事象がおきております。  
下記のようなプログラムを作成し実行すると1回目は正常終了します。  
その後、C:\hoge1\hogeを読取専用(またはプログラムを別ユーザで実行)すると、Stop-
TranScriptでエラーが起きた後、catch以降の文が実行されてしまいます。  
どうもcatch内でエラーが起こると、後続の文を中断して、catch外の文が実行されてしまうように見えます。  
回避する方法があれば、アドバイスいただけるとありがたいです。(Win10_20H2で確認)

[code]

    Start-TranScript -Path C:\hoge1\hoge
    try {
        echo hoge > C:\hoge2\hogehoge   #存在しないフォルダ
    }
    catch {
        echo $_.Exception.Message
        Stop-TranScript
        exit 5
    }
    echo "なぜかここが実行される"
    
[/code]


CC BY-SA 4.0
2022-04-08T14:02:44.207
88227
2022-04-15T12:48:25.040
52147
question
powershell
Powershellでtry-catchのcatch内でエラーが起きるとcatch外が実行されてしまう


PowerShellは他のシェルスクリプトと同様に、エラーが発生しても処理を継続します。この動作は [Common Parameter の
`-ErrorAction`](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.core/about/about_commonparameters?view=powershell-5.1#-erroraction)
で制御できます。  
デフォルトは `-ErrorAction Continue` ですが、`-ErrorAction Stop` を指定すれば停止します。

しかし、質問は `>` によるリダイレクトであり、

[code]

    echo hoge > C:\hoge2\hogehoge
    
[/code]

は内部的には

[code]

    Write-Output hoge | Out-File C:\hoge2\hogehoge
    
[/code]

となっています。

[code]

    Write-Output hoge | Out-File -ErrorAction Stop C:\hoge2\hogehoge
    
[/code]

とすれば止まりますが、元のリダイレクト記法ではパラメーターを指定することができません。この場合でも、[Preference Variable の
`$ErrorActionPreference`](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-5.1#erroractionpreference)
で制御できます。実行前に

[code]

    $ErrorActionPreference = "Stop"
    echo hoge > C:\hoge2\hogehoge
    
[/code]

で処理を止めることができます。


CC BY-SA 4.0
2022-04-09T01:51:56.750
88230
2022-04-09T01:51:56.750
4236
88227
answer