将字符串转换为 PSCustomObject
Convert string to PSCustomObject
我遇到的问题源于将 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 powershell.exe
启动一个新的 PowerShell 进程。您不能跨进程边界传递 PowerShell 对象。
你可以改变
Start-Process powershell.exe -ArgumentList '-NoExit', "$PSScriptRoot\ServiceBus-AsyncWorker.ps1", "'$payload'"
到
$PSScriptRoot\ServiceBus-AsyncWorker.ps1 $payload
避免创建新进程,但那样会 运行 脚本在同一个 window。
如果您需要 运行 从控制台分离脚本,您可以 运行 它作为 background job:
$job = Start-Job -ScriptBlock {
Param($Path, $Data)
& "$Path\ServiceBus-AsyncWorker.ps1" $Data
} -ArgumentList $PSScriptRoot, $payload
否则在生成新进程时需要以序列化形式传递参数(例如原始 JSON):
Start-Process powershell.exe -ArgumentList '-NoExit', "$PSScriptRoot\ServiceBus-AsyncWorker.ps1", "`"$body`""
然后(重新)从字符串创建对象:
Param(
[Parameter(Mandatory=$true)]
[string]$Json
)
# Import RequestHandler module to deal with processing service bus requests
Import-Module $PSScriptRoot\RequestHandler\RequestHandler.psm1
$Request = ConvertFrom-Json $Json
...
我遇到的问题源于将 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 powershell.exe
启动一个新的 PowerShell 进程。您不能跨进程边界传递 PowerShell 对象。
你可以改变
Start-Process powershell.exe -ArgumentList '-NoExit', "$PSScriptRoot\ServiceBus-AsyncWorker.ps1", "'$payload'"
到
$PSScriptRoot\ServiceBus-AsyncWorker.ps1 $payload
避免创建新进程,但那样会 运行 脚本在同一个 window。
如果您需要 运行 从控制台分离脚本,您可以 运行 它作为 background job:
$job = Start-Job -ScriptBlock {
Param($Path, $Data)
& "$Path\ServiceBus-AsyncWorker.ps1" $Data
} -ArgumentList $PSScriptRoot, $payload
否则在生成新进程时需要以序列化形式传递参数(例如原始 JSON):
Start-Process powershell.exe -ArgumentList '-NoExit', "$PSScriptRoot\ServiceBus-AsyncWorker.ps1", "`"$body`""
然后(重新)从字符串创建对象:
Param(
[Parameter(Mandatory=$true)]
[string]$Json
)
# Import RequestHandler module to deal with processing service bus requests
Import-Module $PSScriptRoot\RequestHandler\RequestHandler.psm1
$Request = ConvertFrom-Json $Json
...