I have folder c:\test where I have three files: “file1”, “file2”, “file3”
Following script:
$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
However, if I uncomment “$Using:exclude” I get the result:
Suddenly exclude list starts working properly
Just specifying
$Using:exclude
in the Where-Object cmdlet doesn't work because it is in a nested scriptblock.In your case , the
Using:folder
works because it is a local variable directly passed to theInvoke-Command
scriptblock.But "
Using:exclude
is passed to a scriptblock forWhere-Object
, which is itself nested inside the scriptblock forInvoke-Command
.$Using
allows to pass local variables to scriptblocks only one level deep, not to scriptblocks nested any further. This behaviour is not specific to theWhere-Object
scriptblock, any cmdlet which has a parameter taking a scriptblock behaves like this when it is inside aInvoke-Command
scriptblock.Unfortunately, I don't think this behaviour is documented.
By uncommenting
$Using:exclude
at the beginning of theInvoke-Command
scriptblock, you are effectively declaring the variable$exclude
inside the remote session. So, in this case,$exclude
becomes a local variable inside theInvoke-Command
scriptblock and can be passed one level further, to the nestedWhere-Object
scriptblock.That's why it works when you uncomment
$Using:exclude
at the beginning of theInvoke-Command
scriptblock, it's a workaround for the behaviour of$Using
.For the official help information about this run :