PowerShell で値を返す方法

  1. PowerShell における return キーワードの使用
  2. PowerShell におけるパイプラインの返り値
  3. PowerShell 5 でのクラス定義
PowerShell で値を返す方法

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

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

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

PowerShell における return キーワードの使用

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

return <expression>

return キーワードは単独で現れることもできますし、その後に値や式が続くこともできます。return キーワードだけでは、コマンドラインを前の呼び出し地点に戻します。

return
return $a
return (1 + $a)

以下の例では、特定のポイントで条件が満たされた場合に関数を退出するために 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

第二のスクリプトブロックでも 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 の使用

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

例コード:

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

出力:

Count
-----
    1

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

PowerShell 5 でのクラス定義

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
チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
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