web-dev-qa-db-ja.com

PowerShellの関数にハッシュテーブルを渡す方法は?

PowerShell関数にハッシュテーブルを渡すと、オブジェクトを受け取ると文句を言います。

Function ExtendHash(){
  param(
    [hashtable] $source,
    [hashtable] $extender
  )
  ...
}

そして、呼び出し元:

$hash1 = @{One = 1; Two = 2}
$hash2 = @{Two = 22; three = 3}
ExtendHash($hash1, $hash2)

System.Object []型のSystem.Object []値をSystem.Collection.Hashtable型に変換できません

それでは、この作業をどのように行うのでしょうか?提案?

また、組み込みのものがありませんか? JavaScriptがデフォルトオプションを拡張するために使用するものと同じパターンが必要です(デフォルト値をマージしてオーバーライドします)。

26
Stéphane

括弧とコンマを使用しないでください。これはPowerShellです(たとえば、引数はCMDのコマンドの引数に似ています)。つまり、次のように関数を呼び出します。

ExtendHash $hash1 $hash2

あなたの場合、式($hash1,$hash2)は2つの項目の配列であり、この配列、1つの引数を関数に渡します。このような呼び出しは正しく失敗します。


Set-StrictMode -Version 2を使用すると、この「よくある」間違いがPowerShellで検出されます。

関数またはコマンドがメソッドのように呼び出されました。パラメーターはスペースで区切る必要があります。パラメーターの詳細については、about_Parametersヘルプトピックを参照してください。

27
Roman Kuzmin

ローマの答え :)の隣
呼び出し側はハッシュテーブルを変数に保存する必要がなく、これも使用できます:

ExtendHash  -source @{One = 1; Two = 2}  -extender @{Two = 22; three = 3}

-source-extenderが必要なので、ハッシュテーブル自体はExtendHashに対してそれ自体でarg-value-pairsとして解釈されません)

3