Windows PowerShellのFunction入門 (出力編)

この記事はWindows PowerShellのFunctionの出力に関する基本的な話です

PowerShellではReturnがなくても戻り値が返される (むしろ意識的に消さないと意図せぬ戻り値が生じてしまう) という話です


PowerShellではFunction (ScriptBlock/Filter/スクリプトファイル) 内で明示的に出力の指定をしなくても、値が出力されます

そしてコンソールへの出力は、Write-Hostで明示しなくてもコンソール上に表示されます

結果としてコンソール上で実行された関数内に値が書かれていた場合、コンソール上に値が表示されます

PS> Function SampleFunction1 {'Hello World';}
PS> SampleFunction1;
Hello World

複数の出力があった場合、出力はObjectの配列になります

明示的に値を出力したい場合、Write-Outputを使うことが出来ます

Returnを使った場合、Returnに渡された値を出力した上でその関数を終了させ、もし値を渡さなかった場合は単にその関数が終了します

以下のScriptは全て同じ結果になります

Function SampleFunction2 {
    'Hello', 'World';
}

Function SampleFunction3 {
    'Hello';
    'World';
}

Function SampleFunction4 {
    Write-OutPut -InputObject 'Hello', 'World'; 
}

Function SampleFunction5 {
    Write-OutPut -InputObject 'Hello'; 
    Write-OutPut 'World'; # -InputObject は省略可能
}

Function SampleFunction6 {
    Return 'Hello', 'World';
}

Function SampleFunction7 {
    'Hello';
    'World';
    Return;
}

(私が) うっかりしがちな例として、オブジェクトのメソッドの処理し忘れなどで意図しない出力が発生することがあります

Function SampleFunction8 {
    # XxxObject.Setは、処理後のXxx.Objectが返却されるmethod
    XxxObject.Set(0); 
    XxxObject.Set(1); 
    XxxObject.Set(2); 
    XxxObject.Set(3); 
    Return XxxObject.Value; # String型の値のProperty
}

[String] $XxxString = SampleFunction6; # XxxObject.Set() と XxxObject.Value、合計5つの出力を配列で受け取り、エラーとなる

このような場合、何らかの方法で値を捨てる必要があります

Function SampleFunction9 {
    $null = XxxObject.Set(0); # $Nullに代入 (結果、何も出力されないし、$Nullは$Nullのまま)
    [Void] XxxObject.Set(1); # Voidに変換 (結果、何も出力されない)
    XxxObject.Set(2) > $Null; # $Nullに対して出力 (結果、何も出力されない)
    XxxObject.Set(3) | Out-Null; # パイプラインを経由してOut-Nullに値を渡す (結果、何も出力されない)
    Return XxxObject.Value;
}

[String] $XxxString = SampleFunction6; # XxxObject.Valueの結果のみを受け取る

なお、上記で4つの例を示しましたが、PowerShellでNull破棄する際に最も適したやり方を探る - tech.guitarrapc.cómによればOut-Nullだけ実行速度が遅いようなので、 Out-Nullは使わない方が無難なようです