2011-12-29 10 views
5

だから私は、次のコードがある場合を返す:問題ハッシュテーブル

function DoSomething { 
    $site = "Something" 
    $app = "else" 
    $app 
    return @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo["site"] 

しないのはなぜ$ SITEINFO [「サイト」]リターン「何か」?

私は....ちょうど

$siteInfo 

を述べることができますし、それは私が何をしないのです

else 

Key: site 
Value: Something 
Name: site 

Key: app 
Value: else 
Name: app 

戻りますか?

+0

'$ SITEINFO [ "サイト"]' '私のためSomething'を返すん。私のために – Rynant

+0

も、PowerShellのバージョン? –

+0

私はもう少し詳しい情報があります。私は関数コードの上の変数($ app)の単なる呼び出しを追加しました。 $ appとハッシュテーブルからの値が、関数を呼び出した変数に返されたということが起こっていました。だからもし私が($ siteInfo | fl)したら、 "else"と2つのキー/値の両方が表示されます。何故ですか? – pghtech

答えて

12

PowerShellでは、関数は関数の各行から返されるすべての値を返します。明示的なreturnステートメントは必要ありません。

String.IndexOf()メソッドは整数値を返します。この例では、DoSomething.GetType()のようにオブジェクトの配列として '2'およびハッシュテーブルを返します。不要な出力を捕捉するためのScriptBlockに複数のステートメントをラップする方法の一例である。ここで

function DoSomething { 
    $site = "Something" 
    $app = "else" 

    $null = $app.IndexOf('s') # 1 
    [void]$app.IndexOf('s')  # 2 
    $app.IndexOf('s')| Out-Null # 3 

    # Note: return is not needed. 
    @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo['site'] 

function DoSomething { 
    # The Dot-operator '.' executes the ScriptBlock in the current scope. 
    $null = .{ 
     $site = "Something" 
     $app = "else" 

     $app 
    } 

    @{"site" = $($site); "app" = $($app)} 
} 

DoSomething 
+0

@Thanks Rynant - この例では、戻り値を管理するより良い方法はありません。変数を設定するのは非常に一般的ですが、戻ってすべての戻り値が返されないようにするためには、いくつかの行関数が醜い混乱に変わります。あなたはI.E.> FunctionName | $ _。<何かここ>>戻り値に到達するには? – pghtech

+1

@pghtech - 実際には、私は通常、戻り値を明示的にブロックする必要が何度もないことがわかりません。なぜなら、通常は戻り値を使用しているか、戻り値がないからです。実際に見たことがあるのか​​どうかはわかりませんが、すべてを '$ null =。{} 'で囲むことができると思いますが、むしろ' Out-Null'などを使用します必要。 – Rynant

+0

真剣に、なぜですか?ほとんど私のラップトップは、いくつかの***機能を作ろうとしました! – Geoffroy

1

function DoSomething { 
    $site = "Something" 
    $app = "else" 
    $app.IndexOf('s') 
    return @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo.GetType() 

次の例では、不要な出力を遮断する3つの方法を示しています@Rynant非常に役に立つポスト、関数出力を隠す例を提供してくれてありがとう!

私の提案された解決策:

function DoSomething ($a,$b){ 
    @{"site" = $($a); "app" = $($b)} 
} 

$c = DoSomething $Site $App