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
No entanto, se eu descomentar "$usando: excluir " eu fico com o resultado:
de repente, a lista de exclusão começa a funcionar correctamente
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
.
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 .
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