Receive-Job不会保留我的对象

时间:2016-05-30 15:42:22

标签: powershell powershell-v3.0 powershell-v4.0

我试图返回一个有序的dictionnary,用于执行另一个脚本的启动作业的powershell脚本。

被调用脚本返回一个变量$ 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

您是否知道如何通过接收工作保留我的[有序]类型?

TIA

问候

1 个答案:

答案 0 :(得分: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