Я бы не стал добавлять +=
к хеш-таблицам, но вместо этого использовал бы ForEach-Object для хэшей .Keys
. Таким образом, код можно сократить, но также вам будет проще выбрать, хотите ли вы, чтобы возможные дубликаты из Hashtable 1 ($ first) были перезаписаны значениями из второго Hashtable ($ second).
Примерно так:
$first = @{}
$first.Add('John', 'Doe')
$first.Add('Johnny', 'Doe')
$second = @{}
$second.Add('Jack', 'Test')
$second.Add('Jacky', 'Test')
$second.Add('Johnny', 'Depp') # Duplicate key: same first name, different lastname
$all = @{}
# copy all keys and values from the $first Hashtable into $all
$first.Keys | ForEach-Object { $all[$_] = $first[$_] }
В следующей части вам нужно будет решить, что делать с дублирующимися ключами:
Метод 1
# add the stuff from Hashtable $second to it:
# this will overwrite the value if the key already exists (i.e. $second value 'wins')
$second.Keys | ForEach-Object { $all[$_] = $second[$_] }
ИЛИ используйте Метод 2
# make sure the value of the $first hashtable is NOT overwritten (i.e. $first value 'wins')
$second.Keys | ForEach-Object { if (!($all.ContainsKey($_))) { $all[$_] = $second[$_] }}
Если вы решите перезаписать (метод 1), хэш $ all будет содержать
Name Value
---- -----
John Doe
Jacky Test
Johnny Depp
Jack Test
Если вы выберете НЕдля перезаписи (метод 2), $ all будет
Name Value
---- -----
John Doe
Jacky Test
Johnny Doe
Jack Test
Edit Существует другой подход, в котором вы полагаетесь натот факт, что возникает исключение, если вы пытаетесь добавить запись, которая уже существует. В этом случае используйте метод .Add(key, value)
и оберните его внутри блока try{..} catch{..}
. Без этой ошибки ошибка не позволяет заполнить хэш-таблицу $all
, поскольку она останавливается на первом дублирующемся ключе, который вы пытаетесь добавить.
$second.Keys | ForEach-Object {
try {
$all.Add($_, $second[$_])
}
catch {
# catch the exception in order to carry on adding items
# the effect will be that the values from $first will not be overwritten
# just like with method 2
Write-Warning $_.Exception.Message
}
}