无法将PSObject作为参数传递给Start-Process

时间:2018-03-16 06:41:31

标签: powershell start-process psobject

我需要读取输入文件,这是一个xml(如下所示)

<Parent>
  <Child>
    <grandchilditem1>Server1</grandchilditem1>
    <grandchilditem2>Database1</grandchilditem2>
  </Child>
</Parent>
<Parent>
  <Child>
    <grandchilditem1>Server1</grandchilditem1>
    <grandchilditem2>Database1</grandchilditem2>
  </Child>
</Parent>

我的主要PowerShell脚本解析xml,并在每个Child的foreach循环中创建一个带有输入参数的对象,并使用参数调用另一个powershell脚本,作为从每个子项创建的对象。这对于在不同控制台中并行运行脚本是必要的。

$Child.ChildNodes.GetEnumerator()|ForEach-Object{
  $InputOBJ = New-Object PSObject -Property @{
        Server = $_.grandchilditem1
        Database = $_.grandchilditem2
    }
  $psfilepath = Get-Location
  Start-Process -filepath "powershell.exe" -ArgumentList @("-NoExit", "$psfilepath\ls.ps1 $InputOBJ") -WindowStyle Normal
}

我的问题是,这执行正常并为2个子节点打开两个不同的控制台,但$ inputobj没有完全传递。它被截断了。但是,如果我将每个单独的参数作为字符串值传递,它将接受所有参数。

我想知道,对象没有正确传递的原因是什么。

在打开的新控制台中,输出将只是第一个项目。 例如,我的ls.ps1有一个声明

write-host $inputobj 

它输出,就是这个。

@ {服务器= Server1上;

对象结构也受到了损害。我相信,它被发送为字符串而不是对象。

如果有人对此有更多了解,请告诉我。

1 个答案:

答案 0 :(得分:0)

由于只能将字符串传递给Start-Process,另一种方法是使用Export-Clixml将对象序列化为xml,将路径传递给序列化对象,然后在目标脚本中使用{{{{}}反序列化对象。 3}}

您的主脚本将如下所示:

$tempObjectPath = [System.IO.Path]::GetTempFileName()
Export-Clixml -InputObject $InputOBJ -Path $tempObjectPath

$psfilepath = Get-Location
Start-Process `
    -filepath "powershell.exe" `
    -ArgumentList @("-NoExit", "$psfilepath\ls.ps1 $tempObjectPath") `
    -WindowStyle Normal

然后在目标脚本中,将xml反序列化回PSObject:

$InputOBJ = Import-Clixml -Path $tempObjectPath

# Optionally, delete the temporary file
Remove-Item -Path $tempObjectPath -Force