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つあります:
- すべての出力がキャプチャされ、返される。
- 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
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn