PowerShell での戻り値

Marion Paul Kenneth Mendoza 2023年1月30日
  1. PowerShell で return キーワードを使用する
  2. PowerShell のパイプラインの戻り値
  3. PowerShell5 でのクラスの定義
PowerShell での戻り値

一般に、return キーワードは、関数、スクリプト、またはスクリプトブロックを終了します。したがって、たとえば、これを使用して、スコープを特定のポイントに残したり、値を返したり、スコープの終わりに到達したことを示したりすることができます。

ただし、Windows PowerShell では、スクリプトが予期しない出力を出力する可能性があるため、return キーワードを使用すると少し混乱する可能性があります。

この記事では、return キーワードがどのように機能するか、および Windows PowerShell でそれらを適切に使用する方法について説明します。

PowerShell で return キーワードを使用する

以下のスクリプトブロックは、return キーワードの構文の基本的な形式です。

return <expression>

return キーワードは単独で表示することも、値または式の後に続けることもできます。return キーワードだけで、コマンドラインを前の呼び出しポイントに戻します。

return
return $a
return (1 + $a)

以下の例では、特定のポイントで条件が満たされた場合に、return キーワードを使用して関数を終了します。この例では、return ステートメントがそのステートメントを実行する前に実行されるため、奇数は乗算されません。

function MultiplyOnlyEven
{
    param($num)

    if ($num % 2) { return "$num is not even" }
    $num * 2
    return
}

1..10 | ForEach-Object {MultiplyOnlyEven -Num $_}

出力:

1 is not even
4
3 is not even
8
5 is not even
12
7 is not even
16
9 is not even
20

Windows PowerShell は、よりネイティブなプログラミングの観点から見ると、紛らわしいリターンセマンティクスを持っています。考慮する必要のある主なアイデアは 2つあります。

  1. すべての出力がキャプチャされ、返されます。
  2. return キーワードは、論理出口点を示します。

そうは言っても、次の 2つのスクリプトブロックは $a 変数の値を返します。

式を含むキーワードを返します。

$a = "Hello World"
return $a

式なしでキーワードを返す:

$a = "Hello World"
$a
return

コマンドラインで変数を呼び出すとその変数が明示的に返されるため、2 番目のスクリプトブロックでも return キーワードは必要ありません。

PowerShell のパイプラインの戻り値

スクリプトブロックまたは関数から値を返すと、Windows PowerShell はメンバーを自動的にポップし、パイプラインを介して一度に 1つずつプッシュします。この使用例の背後にある理由は、Windows PowerShell の一度に 1つの処理によるものです。

次の関数は、このアイデアが数値の配列を返すことを示しています。

function Test-Return
{
    $array = 1,2,3
    return $array
}
Test-Return | Measure-Object | Select-Object Count

出力:

Count
-----
    3

Test-Return コマンドレットを使用する場合、以下の関数からの出力は Measure-Object コマンドレットにパイプされます。コマンドレットはパイプライン内のオブジェクトの数をカウントし、実行されると、返されるカウントは 3 になります。

スクリプトブロックまたは関数がパイプラインに単一のオブジェクトのみを返すようにするには、次のいずれかのメソッドを使用します。

PowerShell で単項配列式を利用する

次の例に示すように、単項式を使用すると、戻り値を単一のオブジェクトとしてパイプラインに送信できます。

function Test-Return
{
    $array = 1,2,3
    return (,$array)
}
Test-Return | Measure-Object | Select-Object Count

出力:

Count
-----
    1

PowerShell の NoEnumerate パラメーターで Write-Output を使用する

-NoEnumerate パラメーターを指定して Write-Output コマンドレットを使用することもできます。以下の例では、Measure-Object コマンドレットを使用して、return キーワードによってサンプル関数からパイプラインに送信されたオブジェクトをカウントします。

サンプルコード:

function Test-Return
{
    $array = 1,2,3
    return Write-Output -NoEnumerate $array
}
Test-Return | Measure-Object | Select-Object Count

出力:

Count
-----
    1

パイプラインに単一のオブジェクトのみを返すように強制する別の方法は、PowerShell バージョン 5 で導入されています。これについては、この記事の次のセクションで説明します。

PowerShell5 でのクラスの定義

Windows PowerShell バージョン 5.0 では、カスタムクラスを作成および定義できるようになりました。関数をクラスに変更すると、return キーワードはその直前の単一のオブジェクトのみを返します。

サンプルコード:

class test_class {
    [int]return_what() {
        Write-Output "Hello, World!"
        return 1000
    }
}
$tc = New-Object -TypeName test_class
$tc.return_what()

出力:

1000

上記のクラスが関数の場合、パイプラインに格納されているすべての値を返します。

出力:

Hello World!
1000
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn