В чем разница между точкой (.) И амперсандом (&) в PowerShell? - PullRequest
0 голосов
/ 13 февраля 2019

В чем разница между использованием точки (.) и амперсанда (&) в PowerShell при вызове командлета, функции, файла сценария или работающей программы?

Например:

. foo.sh1
& foo.sh1

Очень похожий вопрос, который был неправильно закрыт как дубликат: Различия между амперсандом (&) и точкой (.) При вызове блока сценариев PowerShell .Вопросы разные и имеют совершенно разные ключевые слова и поисковый рейтинг.Ответ на Что означает сокращение `.` в конвейере PowerShell? отвечает только на половину вопроса.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Чтобы отделиться и дать ясное понимание, я объясняю сценарий.Представьте, что у вас есть функция с именем MyFunction в source.ps1.И вы хотите использовать эту функцию в другом скрипте ( MyCustomScript.ps1 )

Поместите строку в MyCustomScript.ps1, как показано ниже, и вы сможете использовать ее.

. path\of\the\source.ps1 

MyFunction

Итак, вы используете функцию, которая присутствует в source.ps1 в вашем собственном скрипте.Принимая во внимание, что & является оператором вызова в Powershell, который поможет вам вызвать любой внешний исполняемый файл, такой как psexec и другие.

Вызов команды (напрямую или с оператором вызова) создаст другую область, известную как дочерняя область, и исчезнет после выполнения команды.Если команда изменяет какое-либо из значений в глобальной переменной, то в этом случае изменения будут потеряны и по окончании области действия.

Чтобы избежать этого недостатка и сохранить любые изменения, внесенные в глобальные переменные, вы можетеdot сценарий, который всегда будет выполнять сценарий в вашей текущей области.

Точечный источник будет запускать функцию или сценарий только в пределах текущей области и оператора вызова (&), который будет запускать функцию или сценарийпо-прежнему;но это никогда не добавит к текущей области видимости.

Надеюсь, это даст представление о том, когда что использовать.

0 голосов
/ 14 февраля 2019
  • Разница между операторами . и & имеет значение только при вызове сценариев или функций (или их псевдонимов)) - для командлетов и внешних программ они действуют одинаково.

  • Для сценариев и функций . и & отличаются областью определения функций , псевдонимов и переменных :

    • &, оператор вызова , выполняет сценарии и функции в области действия child , которая является типичный сценарий использования : функции и сценарии обычно ожидают выполнения без побочных эффектов :

      • Переменные, (вложенные) функции, псевдонимы, определенные в вызываемом скрипте / функции, являются локальными для вызова и выходят из области видимости при выходе из скрипта / возвращении функции.

      • Тем не менее, обратите внимание, что даже сценарий, запущенный в дочерней области действия, может повлиять на среду вызывающего пользователя , например, с помощью Set-Location для изменения текущего местоположения, явно изменяя родительскую область (Set-Variable -Scope 1 ...) или глобальную область ($global:...) или определение переменных среды уровня процесса.

    • ., оператор точечного выбора , выполняет сценарии и функции в текущей области и обычно используется для изменения области действия вызывающего абонента путемдобавление функций, псевдонимов и, возможно, переменных для последующего использования .Например, этот механизм используется для загрузки файла $PROFILE, который инициализирует интерактивный сеанс.

Предупреждение заключается в том, что для функции (в отличие от сценариев) справочная область для child против current не обязательно является областью вызывающего абонента : если функция была определена в модуле , ссылочная область действия область действия этого модуля :

  • Другими словами: попытка использовать . с функцией , созданной модулемпрактически бессмысленно, потому что изменяемая область видимости - это модуля .
  • Тем не менее, функции, определенные в модулях, обычно в любом случае не рассчитаны на точечный источник.
0 голосов
/ 13 февраля 2019

Как Матиас, упомянутый как комментарий в этой ветке.& используется для вызова выражения, которое следует после &, а . используется для вызова его в текущей области и обычно используется для создания точки вспомогательного файла, который содержит функции, чтобы сделать его доступным в области действия вызывающих.

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