PowerShell Remoting $à l'Aide de la portée des variables
J'ai un dossier c:\test lorsque j'ai trois fichiers: “fichier1”, “fichier2”, “fichier3”
Script suivant:
$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
Donne le résultat:
Cependant, si je décommenter “$à l'Aide de:exclure”, j'obtiens le résultat:
Soudain exclure de la liste commence à travailler correctement
Vous devez vous connecter pour publier un commentaire.
Juste précisant
$Using:exclude
dans le cas d'Objet applet de commande ne fonctionne pas car il est dans un imbriquée scriptblock.Dans votre cas , le
Using:folder
fonctionne, car il est une variable locale directement passés à laInvoke-Command
scriptblock.Mais "
Using:exclude
est passé à un scriptblock pourWhere-Object
, qui est elle-même imbriquée à l'intérieur de la scriptblock pourInvoke-Command
.$Using
permet de passer des variables locales à scriptblocks un seul niveau de profondeur, de ne pas scriptblocks imbriquée plus loin.Ce comportement n'est pas spécifique à la
Where-Object
scriptblock, tout applet de commande qui a un paramètre de prendre un scriptblock se comporte comme cela quand il est dans uneInvoke-Command
scriptblock.Malheureusement, je ne pense pas que ce comportement est documenté.
En décommentant
$Using:exclude
au début de laInvoke-Command
scriptblock, vous êtes effectivement en déclarant la variable$exclude
à l'intérieur de la session à distance.Donc, dans ce cas,
$exclude
devient une variable locale à l'intérieur de laInvoke-Command
scriptblock et peut être passé à un niveau plus loin, à la imbriquéeWhere-Object
scriptblock.C'est pourquoi il fonctionne lorsque vous supprimez
$Using:exclude
au début de laInvoke-Command
scriptblock, c'est une solution de contournement pour le comportement de$Using
.Pour l'aide officielle d'informations sur cette course :