我需要读取输入文件,这是一个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上;
对象结构也受到了损害。我相信,它被发送为字符串而不是对象。
如果有人对此有更多了解,请告诉我。
答案 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