PowerShell Remoting $使用变量范围

时间:2014-07-28 13:52:14

标签: powershell powershell-v3.0 powershell-remoting

我有文件夹c:\ test我有三个文件:“file1”,“file2”,“file3”

以下脚本:

$remoteSession = New-PSSession -ComputerName localhost
$folder = "c:\test"
$exclude =@("c:\test\file1","c:\test\file2")

Invoke-Command -Session $remoteSession -ScriptBlock {    
    #$Using:exclude
    Get-ChildItem -Path $Using:folder -recurse | Where {$Using:exclude -notcontains $_.FullName}
}

Remove-PSSession $remoteSession 

给出结果: Picture 1

但是,如果我取消注释“$ Using:exclude”,我会得到结果: enter image description here

突然排除列表开始正常工作

1 个答案:

答案 0 :(得分:13)

仅在Where-Object cmdlet中指定$Using:exclude并不起作用,因为它位于嵌套的 scriptblock 中。

在您的情况下,Using:folder有效,因为它是直接传递给Invoke-Command scriptblock 的本地变量。

但是" Using:exclude被传递给Where-Object scriptblock Invoke-Command本身嵌套在 scriptblock 中{{1} }}

$Using允许将局部变量传递给只有一级深度的脚本块,而不是将 scriptblocks 嵌套到更远的位置。 此行为并非特定于Where-Object脚本块,任何 cmdlet ,如果脚本块位于Invoke-Command脚本块中,则该参数将采用与此类似的参数。

不幸的是,我并不认为这种行为是有记录的。

通过在$Using:exclude scriptblock 的开头取消注释Invoke-Command,您实际上是在远程会话中声明变量$exclude。 因此,在这种情况下,$exclude成为Invoke-Command scriptblock 中的局部变量,可以进一步传递给嵌套的Where-Object scriptblock

当您在$Using:exclude脚本块的开头取消注释Invoke-Command时它的工作原理,它是$Using行为的解决方法。

有关此次运行的官方帮助信息:

Get-Help about_remote_variables -Full