PowerShell Remoting $usando o âmbito da variável

tenho a pasta c:\test onde eu tenho três arquivos:" file1"," file2","file3"

seguinte guião:

$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 

dá o resultado: Picture 1

No entanto, se eu descomentar "$usando: excluir " eu fico com o resultado: enter image description here

de repente, a lista de exclusão começa a funcionar correctamente

Author: Void Star, 2014-07-28

1 answers

Só estou a especificar $Using:exclude no cmdlet onde-objecto não funciona porque está num scriptblock aninhado.

No seu caso, o Using:folder funciona porque é uma variável local directamente passada para o Invoke-Command scriptblock .

, Mas "Using:exclude é passado para um scriptblock para Where-Object, que é aninhado dentro de scriptblock para Invoke-Command.

$Using permite passar variáveis locais para scriptblocks de apenas um nível de profundidade, não para Os bloqueios aninharam-se mais. Este comportamento não é específico do scriptblock Where-Object, Qualquer cmdlet que tenha um parâmetro a tomar um scriptblock comporta-se assim quando está dentro de um scriptblock Invoke-Command.

Infelizmente, acho que este comportamento não está documentado.

Descomendando $Using:exclude no início da Invoke-Command scriptblock , Você está efetivamente declarando a variável $exclude dentro da sessão remota. Então, neste caso, $exclude torna-se um variável local dentro da Invoke-Command scriptblock e pode ser passado um nível mais à frente, para o ninho Where-Object scriptblock .

É por isso que funciona quando se descomenta no início do scriptblock de Invoke-Command, é um trabalho para o comportamento de $Using.

Para a informação oficial de Ajuda sobre esta corrida:

Get-Help about_remote_variables -Full
 11
Author: Mathieu Buisson, 2014-11-24 09:42:07