1

Invoke-Expression 呼び出しからのすべての出力 (stderr のリダイレクト) をキャプチャしてログに記録したいのですが、そうすることで、通常はスローされる例外が飲み込まれてしまうようです。

c:\temp\test が既に存在すると仮定すると、このコマンドは例外をスローします。

PS U:\> $cmd = "mkdir c:\temp\test"
PS U:\> $output = Invoke-Expression $cmd
New-Item : Item with specified name C:\temp\test already exists.
At line:38 char:24
+         $scriptCmd = {& <<<<  $wrappedCmd -Type Directory @PSBoundParameters }
    + CategoryInfo          : ResourceExists: (C:\temp\test:String) [New-Item], IOException
    + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand

しかし、stderr をリダイレクトしても、何も起こりません。

PS U:\> $cmd = "mkdir c:\temp\test 2>&1"
PS U:\> $output = Invoke-Expression $cmd
PS U:\>

これは単純化された例であり、多くの種類の呼び出しの関数で Invoke-Expression を使用し、出力をログに記録しています。したがって、この呼び出しを機能させるだけの問題ではありません。

さらに、出力をキャプチャしないと、例外が正しくスローされます。

PS U:\> $cmd = "mkdir c:\temp\test 2>&1"
PS U:\> Invoke-Expression $cmd
New-Item : Item with specified name C:\temp\test already exists.
At line:38 char:24
+         $scriptCmd = {& <<<<  $wrappedCmd -Type Directory @PSBoundParameters }
    + CategoryInfo          : ResourceExists: (C:\temp\test:String) [New-Item], IOException
    + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand

$Error に実際に例外が含まれていることがわかりますが、Invoke-Expression 呼び出しに関連するエラーのみが含まれていると確信できるかどうかはわかりません。

しかし、疑問が残ります。Invoke-Expression からのすべての出力 (stderr を含む) をキャプチャし、それでも例外がスローされるようにするにはどうすればよいですか?

4

1 に答える 1