我正在使用 Powershell v3 在 Windows Server 2012 上测试我的应用程序的部署脚本。该脚本在 Win Server 2008 R2 和带有 Powershell v2 的 Win 7 上运行良好。我现在遇到的问题是我无法访问通过 -ArgumentList 传递的 XML 变量的属性。
我已经能够在一个简单的脚本中使用 Powershell v3 在 Win 7 和 Win Server 2012 上重现该问题,该脚本没有我的主脚本所具有的任何 SharePoint、IIS 和杂项。
脚本(我想我是从现在找不到的类似问题中借用的):
$xml = [xml] (Get-Content (Get-Item (".\input.xml")))
$foobar = $xml.Stuff.FooBars.Foobar
$ScriptBlock = {
$foobar = $args[0]
write-host "Inside the job..."
write-host ("Foobar : "+$foobar)
write-host ("Foobar.Foo : "+$foobar.Foo)
}
write-host "Outside the job..."
write-host ("Foobar: "+$foobar)
write-host ("Foobar.Foo : "+$foobar.Foo)
Start-Job -ScriptBlock $ScriptBlock -ArgumentList $foobar | Out-Null
While (Get-Job -State "Running") { Start-Sleep 2 }
write-host ("Jobs Completed.")
Get-Job | Receive-Job
Remove-Job *
输入 XML:
<?xml version="1.0"?>
<Stuff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FooBars>
<FooBar>
<Foo>ThisIsAFoo</Foo>
<Bar>ThisIsABar</Bar>
</FooBar>
</FooBars>
</Stuff>
Powershell v2 的输出:
PS C:\Powershell3Issues> .\demo.ps1
Outside the job...
Foobar: System.Xml.XmlElement
Foobar.Foo : ThisIsAFoo
Jobs Completed.
Inside the job...
Foobar : System.Collections.ArrayList System.Collections.ArrayList
Foobar.Foo : ThisIsAFoo
Powershell v3 的输出:
PS C:\Powershell3Issues> .\demo.ps1
Outside the job...
Foobar: System.Xml.XmlElement
Foobar.Foo : ThisIsAFoo
Jobs Completed.
Inside the job...
Foobar : System.Collections.ArrayList System.Collections.ArrayList
Foobar.Foo :
请注意缺少的 Foobar.Foo 值。
我也尝试过 v3 中的 $using 语法,但它做同样的事情。