2016-05-30 2 views
0

Я пытаюсь вернуть упорядоченную dictionnary для скрипта powershell, запускаемого через запуск из другого скрипта.Receive-Job не поддерживает мой объект

Вызываемый скрипт возвращает переменную $ Readahead, что этот тип:

[DBG]: [Job23]: PS C:\Users\litroma\Documents>> $readahead.GetType() 
IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  OrderedDictionary      System.Object 

Но как только эта переменная является извлечь из сценария вызывающего абонента, хотя:

$ret=receive-job -Job $job 

переменной $ RET является что тип:

[DBG]: PS C:\Users\litroma\Documents>> $ret.GetType() 
IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Hashtable        System.Object 

Знаете ли вы способ сохранить свой [заказываемый] тип через приемную работу?

ТИА

С уважением

ответ

2

Проблема здесь в том, что для того, чтобы пройти забрать результаты внешнего процесса, который выполняет работу, ему нужно сериализовать объекты во время выполнения.

К сожалению, процесс сериализации, похоже, превращает любой тип Dictionary в Hashtable.

Вы можете увидеть этот эффект за счет экспорта и повторного импорта в ordered объект словаря:

PS C:\> [ordered]@{1=1;2=2;3=3} |Export-Clixml ($tmpFile = [System.IO.Path]::GetTempFileName()) 
PS C:\> (Import-Clixml $tmpFile).GetType().FullName 
System.Collections.Hashtable 

Я не думаю, что это можно преодолеть без некоторые серьезные простирающийся от OrderedDictionary класса, что делает код менее многоразовые ,

Альтернативой возвращает массив объектов (массивы упорядочены), а затем воссоздать OrderedDictionary после получения задания

+0

ИМХО, * общий * не хороший термин здесь, так как 'Hashtable' не общий класс .NET. – PetSerAl

+0

@PetSerAl true, удалил его, чтобы избежать путаницы –

+0

Спасибо Матиасу за советы. – litroma