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