Выполняется ли Invoke-Command в текущей или дочерней области при локальном запуске? - PullRequest
0 голосов
/ 11 июля 2019

Мне сообщили в комментарии к другому сообщению , что:

Что касается Invoke-Command: к сожалению, документы неверны: по по умолчанию локальный вызов происходит в дочерней области, но вы можете выбрать в том же объеме выполнения с -NoNewScope. - mklement0

Однако, согласно справочной документации (выделение добавлено):

Вы также можете использовать Invoke-Command на локальном компьютере для оценки или запуска строка в блоке скрипта как команда. Windows PowerShell конвертирует сценарий блокирует команду и сразу запускает команду в текущая область действия , а не просто отображение строки в командной строке.

Кажется, это работает как ожидалось:

PS C:\> $TestVar = 99
PS C:\> Invoke-Command { Get-Variable TestVar }

Name                           Value
----                           -----
TestVar                        99

Если документация неверна, я ожидаю, что это приведет к недоступности переменной для Invoke-Command. В конце концов, правильна ли документация?

1 Ответ

3 голосов
/ 11 июля 2019

Документация дает смешанную информацию, и цитируемый раздел в вопросе определенно устарел / неверен.

Раздел справки, который дает правильную информацию, находится под -NoNewScope, в котором говорится:

Указывает, что этот командлет выполняет указанную команду в текущей области.По умолчанию Invoke-Command выполняет команды в своей собственной области.

Этот параметр действителен только в командах, которые выполняются в текущем сеансе, то есть в командах, в которых пропущены параметры ComputerName и Session.

Этот параметр был введен в Windows PowerShell 3.0.

Ниже показана правильная информация о области из -NoNewScope (продемонстрировано с пронумерованными областями):

$TestVar = 99
Invoke-Command { Get-Variable TestVar -Scope 0 } #Scope 0, current scope
Invoke-Command { Get-Variable TestVar -Scope 1 } #Scope 1, parent scope
Invoke-Command { Get-Variable TestVar -Scope 0 } -NoNewScope #Scope 0, current scope

Результатыиз первой команды вернет ошибку, говорящую, что переменная не может быть найдена:

PS C:\> Invoke-Command { Get-Variable TestVar -Scope 0 } #Scope 0, current scope
Get-Variable : Cannot find a variable with the name 'TestVar'.

Другие команды вернут информацию о переменной, как и ожидалось.Однако, как упоминалось в комментарии к другому сообщению, -NoNewScope должен использоваться для явного указания Invoke-Command использовать текущую область, иначе он будет работать в дочерней области по умолчанию.

ТолькоПричина, по которой команда в вопросе сработала, заключается в том, что переменные доступны для дочерних областей по умолчанию, и не нужно объявлять область видимости, поскольку не использовался ни параметр -ComputerName, ни -Session.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...