PowerShell
PowerShellの戻り動作
サーチ…
前書き
現在のスコープを終了するために使用することができます。スコープは、関数、スクリプト、スクリプトブロックのいずれかです。 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-Object
、 Where-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が含まれているので、残りの関数と同じスコープを取得します。
したがって、スクリプトブロック内で作成された変数にアクセスできます。