Удаленное взаимодействие PowerShell $ Использование области видимости переменных

У меня есть папка c: \ test, в которой есть три файла: «файл1», «файл2», «файл3».

Следующий сценарий:

$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 

Выдает результат:  Изображение 1

Однако, если я раскомментирую «$ Using: exclude», я получу результат:  введите описание изображения здесь

Внезапно список исключений начинает работать правильно


person user3884425    schedule 28.07.2014    source источник
comment
Я получаю: New-PSSession : [localhost] Beim Verbinden mit dem Remoteserver "localhost" ist folgender Fehler aufgetreten: Zugriff verweigert   -  person Timo    schedule 14.05.2020
comment
хорошо, я должен быть Administrator, чтобы начать pssession. Другой вопрос: где раскомментировать, это уже раскомментировано.   -  person Timo    schedule 14.05.2020


Ответы (1)


Простое указание $Using:exclude в командлете Where-Object не работает, потому что он находится во вложенном блоке сценария.

В вашем случае Using:folder работает, потому что это локальная переменная, непосредственно переданная Invoke-Command блоку сценария.

Но "Using:exclude передается в блок сценария для Where-Object, который сам вложен в блок сценария для Invoke-Command.

$Using позволяет передавать локальные переменные в блоки сценариев только на один уровень, а не в блоки сценариев, вложенные дальше. Это поведение не является специфическим для Where-Object блока сценария, любой командлет, у которого есть параметр, принимающий блок сценария, ведет себя так, когда он находится внутри блока сценария Invoke-Command.

К сожалению, я не думаю, что такое поведение задокументировано.

Раскомментируя $Using:exclude в начале Invoke-Command блока сценария, вы фактически объявляете переменную $exclude внутри удаленного сеанса. Таким образом, в этом случае $exclude становится локальной переменной внутри Invoke-Command блока сценария и может быть передана на один уровень дальше, во вложенный Where-Object блок сценария.

Вот почему это работает, когда вы раскомментируете $Using:exclude в начале Invoke-Command блока сценария, это обходной путь для поведения $Using.

Для официальной справочной информации об этом запуске:

Get-Help about_remote_variables -Full
person Mathieu Buisson    schedule 09.08.2014
comment
см. мой ответ на этот пост :) - person user3884425; 11.08.2014
comment
В своем ответе вы $ using: две переменные во внешней области удаленного блока сценариев, что позволяет передавать их в блоки сценариев &. Думаю, @Mathieu хорошо это объяснил. - person Mike Shepard; 15.08.2014
comment
В моем случае при раскомментировании $Using:exclude получаются все три файла - person Timo; 14.05.2020