Я получаю сообщение об ошибке при запуске Invoke-Command
, где блок скрипта принимает параметр типа словаря:
Невозможно обработать преобразование аргумента для параметра «словарь». Невозможно преобразовать значение «System.Collections.Hashtable» типа «System.Collections.Hashtable» в тип «System.Collections.Generic.IDictionary`2 [System.String, System.String]». В строке: 7 знаков: 1 + Invoke-Command -ComputerName. -ArgumentList $ dictionary -ScriptBlock ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidData: (:) [], ParameterBindin ... mationException + FullyQualifiedErrorId: ParameterArgumentTransformationError + PSComputerName: localhost
После долгих поисков я смог сократить сценарий до MVP ниже, чтобы показать корень этой проблемы:
[System.Collections.Generic.IDictionary[string, string]]$dictionary = New-Object -TypeName 'System.Collections.Generic.Dictionary[string, string]'
$dictionary.Add('one', 'hello')
$dictionary.Add('two', 'world')
Write-Verbose "Main Script $($dictionary.GetType().FullName)" -Verbose #outputs: VERBOSE: Before System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Invoke-Command -ComputerName . -ArgumentList $dictionary -ScriptBlock {
Param (
#[System.Collections.Generic.IDictionary[string, string]] #if I leave this in I get a conversion error
$dictionary
)
Write-Verbose "Function before $($dictionary.GetType().FullName)" -Verbose #outputs: VERBOSE: After System.Collections.Hashtable
function Poc {} #this line seems to cause the `$dictionary` to become a HashTable
Write-Verbose "Function after $($dictionary.GetType().FullName)" -Verbose #outputs: VERBOSE: After System.Collections.Hashtable
}
Кажется, что если блок скрипта для Invoke-Command
включает какие-либо встроенные функции, тогда параметр автоматически преобразуется в HashTable
; в то время как, если блок скрипта не содержит определений вложенных функций, параметр остается как System.Collections.Generic.IDictionary[string, string]
.
Использую ли я эту функцию неправильно / есть ли общий обходной путь? Или это просто ошибка в PowerShell?