升级到v3后,Powershell start-job arg没有数据

时间:2012-12-18 15:47:26

标签: powershell-v3.0

我有一个用于将升级部署到供应商软件的脚本。该脚本利用xml映射不同的部署路径。我注意到,在强制升级到PowerShell 3后,本周停止了工作。下面是一个用于说明问题的小型演示脚本:

$xml = [xml] (Get-Content (Get-Item (".\FooBar.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 ("Args       : "+$args)
}

write-host "Outside the job..."
write-host ("Foobar: "+$foobar)
write-host ("Foobar.Foo : "+$foobar.Foo)

Start-Job -ScriptBlock $ScriptBlock -Args $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>

v2上的输出:

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
Args       : System.Collections.ArrayList

v3上的输出:

Outside the job...
Foobar: System.Xml.XmlElement
Foobar.Foo : ThisIsAFoo
Jobs Completed.
Inside the job...
Foobar     : System.Collections.ArrayList System.Collections.ArrayList
Foobar.Foo : 
Args       : System.Collections.ArrayList

请注意,在v2中可以确定Foobar.Foo,而在v3中则不能确定。什么会导致这个和最好的工作?范围问题?在我的大型脚本中,XmlElement被传递给其他函数,因此我希望避免将其转换为其他对象或将其分解为其属性并单独发送。

1 个答案:

答案 0 :(得分:0)

我刚遇到同样的问题。我还没有找到确切的原因,但作为一种解决方法,您可以将标志-PSVersion 2.0添加到您的起始作业行。