95642


標題の通りです。  
以下のコードを実行すると、

[code]

    function execCommand {
        Write-Error "Error"
        Write-Host "Host"
    }
    
    Write-Error "before command"
    $command = [scriptblock]$function:execCommand
    Write-Error "after command loaded"
    $command.Invoke()
    Write-Error "after exec"
    
[/code]

コンソール出力には以下のように出力されます。

[code]

    Write-Error: before command
    Write-Error: after command loaded
    Host
    Write-Error: after exec
    
[/code]

`Write-Error "Error"` の出力がされていません。  
これって何故なのでしょうか？  
このような動作になるメカニズムと、Invokeしたscriptblock中でもWrite-Errorで出力できる方法が知りたいです。  
どなたか、ご教示の程お願いいたします。


CC BY-SA 4.0
2023-07-14T05:36:12.040
95607
2023-07-15T23:55:24.600
54357
question
powershell
scriptblockのInvokeを使うと、起動されたスクリプトに書かれているWrite-Errorの出力が印字されない


ScriptBlockを実行するのは[`Invoke-Command`](https://learn.microsoft.com/ja-
jp/powershell/module/microsoft.powershell.core/invoke-
command?view=powershell-7.3)です。`Invoke-Command $command`とすれば、期待通りの出力が得られるでしょう。

[code]

    Write-Error: before command
    Write-Error: after command loaded
    Write-Error: Error
    Host
    Write-Error: after exec
    
[/code]

* * *

PowerShellには3種類の構文が入り混じっています。

  * PowerShellコマンドレットの実行
  * C#ライクな.NETコード実行
  * 外部プロセスの起動

`$command.Invoke()`はC#ライクな.NETコード実行で、これをやる場合はたぶん[`InvokeWithContext`メソッド](https://learn.microsoft.com/en-
us/dotnet/api/system.management.automation.scriptblock.invokewithcontext?view=powershellsdk-7.3.0)に正しい引数を与える必要がありますが、引数を用意できないもしくは大変なので、素直にPowerShellコマンドレットで実行する方が楽です。


CC BY-SA 4.0
2023-07-15T23:55:24.600
95642
2023-07-15T23:55:24.600
4236
95607
answer