web-dev-qa-db-fra.com

Comment passer une table de hachage à une fonction dans PowerShell?

Lors du passage d'une table de hachage à ma fonction PowerShell, il se plaint de recevoir un objet.

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

Et l'appelant:

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

Impossible de convertir la valeur System.Object [] de type System.Object [] en type System.Collection.Hashtable

Alors, comment puis-je faire cela? Suggestions?

De plus, est-ce que je manque quelque chose de intégré? Je veux le même modèle que ce que JavaScript utilise pour étendre les options par défaut (fusionner et remplacer les valeurs par défaut).

26
Stéphane

N'utilisez pas de parenthèses et de virgules. Il s'agit de PowerShell (par exemple, les arguments sont similaires aux arguments des commandes dans CMD). Autrement dit, appelez votre fonction comme ceci:

ExtendHash $hash1 $hash2

Dans votre cas, l'expression ($hash1,$hash2) est un tableau de deux éléments et vous passez ce tableau, un argument, à la fonction. Un tel appel échoue correctement.


Si tu utilises Set-StrictMode -Version 2 alors cette erreur "courante" est détectée par PowerShell:

La fonction ou la commande a été appelée comme s'il s'agissait d'une méthode. Les paramètres doivent être séparés par des espaces. Pour plus d'informations sur les paramètres, consultez la rubrique d'aide about_Parameters.

27
Roman Kuzmin

(à côté de réponse de Roman :)
L'appelant n'a pas besoin de stocker les tables de hachage dans des variables et on peut alors aussi utiliser ceci:

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

(-source et -extender sont nécessaires pour que les tables de hachage elles-mêmes ne soient pas interprétées comme des paires valeur-arg par elles-mêmes pour ExtendHash)

3
Andreas Dietrich