Receive-Job没有返回与没有Job的情况下调用脚本块相同的类型

时间:2017-08-09 18:31:31

标签: .net powershell parallel-processing f# jobs

我正在加载一个在PowerShell脚本中定义某些类型的F#dll,以便创建一个带有正文的Web请求,以将其发送到F#中创建的Web服务。其中一种类型如下:

type Resource =
| VM of VMResource
| Unit of UnitResource 

使用

type VMResource = {
    ComputerName: string
    Ip: string
    Attributes: string[]
}

type UnitResource = {
    UnitName: string
    Ip: string
    Username: string
    Password: string
    Attributes: string[]
}

当我运行以下小的PowerShell片段时,请求的响应实际上是GetResourcesResponse类型(这是一个包含Resource数组的记录类型),这就是我想要的:

Add-Type -Path "pathtomydll.dll"

$fullRequestUrl = "http://localhost:2121/Resources/Get"
$body = "{`"Id`":`"Test`",`"RequestedResources`":[{`"ResourceType`":{`"Case`":`"VM`"},`"Attributes`":[`"A1`",`"A2`"]},{`"ResourceType`":{`"Case`":`"Unit`"},`"Attributes`":[]}]}"

$resp = Invoke-WebRequest $fullRequestUrl -Method Post -Body $body -ContentType "application/json"
$obj = [ServerProtocolTypes+GetResourcesResponse]::FromJson($resp)
$obj.GetType() # GetResourcesResponse

不幸的是,当我尝试在Job中运行相同的代码时,我得到一个带有属性的PSObject类型,该属性是string类型的Resource表示的数组(例如:{{ 1}}),其中不包含有关ResourceTypes+Resource+VMVMResource的任何信息:

UnitResource

在这种情况下,Add-Type -Path "pathtomydll.dll" $fullRequestUrl = "http://localhost:2121/Resources/Get" $body = "{`"Id`":`"Test`",`"RequestedResources`":[{`"ResourceType`":{`"Case`":`"VM`"},`"Attributes`":[`"A1`",`"A2`"]},{`"ResourceType`":{`"Case`":`"Unit`"},`"Attributes`":[]}]}" $job = Start-Job -ScriptBlock { param($url, $reqBody) Add-Type -Path "pathtomydll.dll"; $resp = Invoke-WebRequest $url -Method Post -Body $reqBody -ContentType "application/json"; return [ServerProtocolTypes+GetResourcesResponse]::FromJson($resp) } -ArgumentList ($fullRequestUrl, $body) Wait-Job $job $obj = Receive-Job $job $obj.GetType() # PSObject 是一个字符串数组,其中一个条目为$obj,另一个条目为ResourceTypes+Resource+VM

我有什么方法可以从作业中取回我的ResourceTypes+Resource+Unit对象,而不是包含GetResourcesResponse数组的PSObject

1 个答案:

答案 0 :(得分:2)

根据评论:

我认为问题是来自Jobs的输出在返回时被序列化。您可以使用运行空间而不是作业来运行并行进程并保留本机对象类型。