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 を含む) をキャプチャし、それでも例外がスローされるようにするにはどうすればよいですか?