サーチ…


前書き

現在のスコープを終了するために使用することができます。スコープは、関数、スクリプト、スクリプトブロックのいずれかです。 PowerShellでは、明示的なReturnキーワードがなくても、またはスコープの終わりに達したことを示すために、各ステートメントの結果が出力として返されます。

備考

戻りセマンティクスについて詳しくは、TechNetのabout_Returnページ、またはPowerShellプロンプトからget-help returnを呼び出すことでご覧いただけます。


より多くの事例・解説がある有名なQ&Aの質問:


MSDNのabout_returnはそれを簡潔に説明しています:

Returnキーワードは、関数、スクリプト、またはスクリプトブロックを終了します。特定のポイントでスコープを終了したり、値を返したり、スコープの終わりに達したことを示すために使用できます。

CやC#のような言語に精通しているユーザーは、スコープを明示的に残すロジックを作るために、Returnキーワードを使用することができます。

Windows PowerShellでは、Returnキーワードを含むステートメントがなくても、各ステートメントの結果が出力として返されます。 CやC#のような言語は、Returnキーワードで指定された値のみを返します。

早期終了

function earlyexit {
    "Hello"
    return
    "World"
}

"Hello"は出力パイプラインに配置され、 "World"は出力パイプラインに配置されません

ゴッチャ!パイプラインでの戻り

get-childitem | foreach-object { if ($_.IsReadOnly) { return } } 

Pipelineコマンドレット(例: ForEach-ObjectWhere-Objectなど)はクロージャで動作します。ここでの戻り値は、パイプライン上の次の項目に移動するだけで、終了処理には反映されません。処理を終了する場合は、 returnの代わりにbreakを使用できます。

get-childitem | foreach-object { if ($_.IsReadOnly) { break } } 

ゴッチャ!不要な出力を無視する

インスピレーションを受けた

function bar {
 [System.Collections.ArrayList]$MyVariable = @()
 $MyVariable.Add("a") | Out-Null
 $MyVariable.Add("b") | Out-Null
 $MyVariable
}

.NET ArrayList.Addメソッドは追加後にコレクション内の項目数を返すため、 Out-Nullが必要ArrayList.Add 。省略された場合、パイプラインは1, 2, "a", "b"

不要な出力を省略するには、複数の方法があります。

function bar
{
    # New-Item cmdlet returns information about newly created file/folder
    New-Item "test1.txt" | out-null
    New-Item "test2.txt" > $null
    [void](New-Item "test3.txt")
    $tmp = New-Item "test4.txt"
}

注:なぜ> $nullを好きなのかについては、[まだ作成されていないトピック]を参照してください。

値を返す

about_returnからの言い換え)

以下のメソッドは、パイプライン上で同じ値を持ちます

function foo {
    $a = "Hello"
    return $a
}

function bar {
    $a = "Hello"
    $a
    return
} 

function quux {
    $a = "Hello"
    $a
} 

関数の使い方

関数は、何か他のものによって捕捉されていないものすべてを返します。
returnキーワードを使用すると、戻り行の後のすべての文は実行されません!

このような:

Function Test-Function
{
    Param
    (
        [switch]$ExceptionalReturn
    )
    "Start"
    if($ExceptionalReturn){Return "Damn, it didn't work!"}
    New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
    Return "Yes, it worked!"
}

テスト機能
戻ります:

  • 開始
  • 新しく作成されたレジストリキー(これは、期待していない出力を作成する文がいくつかあるためです)
  • はい、それは働いた!

テスト関数-ExceptionalReturn戻り値:

  • 開始
  • くそー、うまくいきませんでした!

あなたがこれを好きなら、

Function Test-Function
{
    Param
    (
        [switch]$ExceptionalReturn
    )
    . {
       "Start"
        if($ExceptionalReturn)
        {
            $Return = "Damn, it didn't work!"
            Return
        }
        New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
        $Return = "Yes, it worked!"
        Return 
    } | Out-Null
    Return $Return
}

テスト機能
戻ります:

  • はい、それは働いた!

テスト関数-ExceptionalReturn戻り値:

  • くそー、うまくいきませんでした!

このトリックでは、各ステートメントが何を吐き出すのか分からなくても、返される出力を制御できます。

それはこのように動作します

.{<Statements>} | Out-Null

。次のスクリプトブロックをコードに組み込みます
{}はスクリプトブロックをマークします
| Out-NullパイプはOut-Nullへの予期しない出力をパイプします(消えました!)。
scriptblockが含まれているので、残りの関数と同じスコープを取得します。
したがって、スクリプトブロック内で作成された変数にアクセスできます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow