【发布时间】:2018-12-15 23:53:17
【问题描述】:
我遇到的问题源于将PSCustomObject 作为参数传递给Start-Process cmdlet(我实际上是在启动一个新的PowerShell 进程以从调用脚本异步运行脚本)。虽然参数定义为PSCustomObject 类型,但由于某种原因它被接受为字符串,因此看起来我需要将其转换回PSCustomObject 才能访问任何属性。
这是我的调用脚本的必要部分:
# Convert JSON object to PowerShell object
$payload = ConvertFrom-Json $body
Write-Host $payload
## Returns exactly the following PsCustomObject:
## @{os=Windows Server Datacenter 2016; vmName=sbtestvm; diskType=Managed; username=testuser;
## password=Pa55w.rd1234; location=West Europe; size=Standard_D1;
## requestType=0; sender=test}
Write-Host $payload.os
## Returns: Windows Server Datacenter 2016
# Fire up new worker shell asynchronously
Start-Process powershell.exe -ArgumentList '-NoExit', "$PSScriptRoot\ServiceBus-AsyncWorker.ps1", "'$payload'" # -Windowstyle Hidden
还有我执行的脚本:
Param(
[Parameter(Mandatory=$True)]
[PSCustomObject]$Request
)
# Import RequestHandler module to deal with processing service bus requests
Import-Module $PSScriptRoot\RequestHandler\RequestHandler.psm1
Write-Host $Request
## Returns exactly the same as 'Write-Host $payload' in the calling script
Write-Host $Request.os
## Returns empty string
Write-Host $Request.GetType()
## Returns System.String <--- This is the issue
长话短说:有没有办法一开始就防止这个对象被自动解析为字符串?如果不是 - 如何将此字符串转换回相关的对象类型?
【问题讨论】:
-
您是否尝试过删除
Start-Process行中的引号?"'$payload'"->$payload -
是的,我已经在这方面摆弄了很多 - 我也尝试传递原始 JSON 并在其他方法中解析它,但是 JSON 字符串中的所有引号消失,因此它实际上变得毫无用处。由于对象格式中的空格,您的建议失败,因此该命令认为单个参数实际上是多个。
标签: powershell casting start-process