When passing a hash table to my PowerShell function, it complains that it receives an object.
Function ExtendHash(){
param(
[hashtable] $source,
[hashtable] $extender
)
...
}
And the caller:
$hash1 = @{One = 1; Two = 2}
$hash2 = @{Two = 22; three = 3}
ExtendHash($hash1, $hash2)
Cannot convert the System.Object[] value of type System.Object[] to type System.Collection.Hashtable
So how do I make this work? Suggestions?
Also, am I missing something built-in? I want the same pattern as what JavaScript uses to extend default options (merge and override default values).
Do not use parenthesis and commas. This is PowerShell (say, arguments are similar to arguments of commands in CMD). That is, call your function like this:
In your case expression
($hash1,$hash2)
is an array of two items and you pass this array, one argument, to the function. Such a call fails correctly.If you use
Set-StrictMode -Version 2
then this "common" mistake is caught by PowerShell:(next to Roman's answer:)
The caller does not need to store the hashtables in variables and one can then also use this:
(
-source
and-extender
are necessary so the hashtables themselves do not get interpreted as arg-value-pairs by itself forExtendHash
)