我有文件夹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
但是,如果我取消注释“$ Using:exclude”,我会得到结果:
突然排除列表开始正常工作
答案 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