РАЗДЕЛ
about_Command_Precedence
КРАТКОЕ ОПИСАНИЕ
Описывает, как Windows PowerShell определяет выполняемую команду.
ПОЛНОЕ ОПИСАНИЕ
В этом разделе описывается, как Windows PowerShell определяет
выполняемую команду, особенно если в сеансе содержится несколько
команд с одинаковым именем.
Также демонстрируется способ выполнения команд, которые не
выполняются по умолчанию, а также способы предотвращения
конфликта имен в рамках сеанса.
ПРИОРИТЕТ КОМАНД
Если в сеансе существует несколько команд с одинаковыми именами,
Windows PowerShell руководствуется следующими правилами при
определении запускаемой команды.
Эти правила приобретают особое значение при добавлении в сеанс
команд из модулей, оснасток и других сеансов.
-- При указании пути к команде Windows PowerShell выполняет команду из
местоположения, указанного в пути.
Например, следующая команда запускает скрипт FindDocs.ps1,
расположенный в каталоге C:\TechDocs:
C:\TechDocs\FindDocs.ps1
В качестве меры безопасности Windows PowerShell не выполняет
исполняемые (естественные) команды, включая скрипты Windows
PowerShell, если команда не находится в каталоге, указанном в
переменной среды Path ($env:path) или если путь к скрипту не
указан в явном виде.
Для запуска скрипта, расположенного в текущем каталоге,
укажите полный путь или введите (.), чтобы указать на текущий
каталог.
Например, чтобы запустить файл FindDocs.ps1 в текущем
каталоге, введите следующую команду:
.\FindDocs.ps1
-- Если путь не указан, среда Windows PowerShell использует
следующие правила приоритета при выполнении команд.
1. Псевдоним
2. Функция
3. Командлет
4. Встроенные команды Windows
Таким образом, при вводе команды "help" Windows PowerShell
сначала выполняет поиск псевдонима с именем "help", затем
функции с именем "help" и, наконец, командлета с именем
"help". Будет выполнен первый найденный элемент с именем "help".
Например, если существует функция с именем Get-Map, и в сеанс
был добавлен или импортирован командлет с именем Get-Map, то
при вводе команды "Get-Map" по умолчанию Windows PowerShell
выполнит функцию.
-- Если в сеансе содержатся элементы одного типа с одинаковыми
именами, например два командлета с одинаковыми именами,
Windows PowerShell выполнит элемент, добавленный в сеанс последним.
Например, если существует командлет с именем Get-Date, и в
сеанс был импортирован командлет с именем Get-Date, то при
вводе команды "Get-Date" по умолчанию Windows PowerShell
выполнит импортированный командлет.
СКРЫТЫЕ И ЗАМЕНЕННЫЕ ЭЛЕМЕНТЫ
В результате использования таких правил элементы могут заменяться
или скрываться элементами с таким же именем.
-- Элементы "скрываются" или "затеняются", если доступ к
исходному элементу все же возможен, например путем
указания имени модуля или оснастки.
Например, при импорте функции, имя которой совпадает с
именем командлета, существующего в сеансе, командлет
скрывается, но не заменяется, поскольку он был
импортирован из оснастки или модуля.
-- Элементы "заменяются" или "перезаписываются", если доступ
к исходному элементу становится невозможен.
Например, при импорте переменной, имя которой совпадает с
именем переменной, существующей в сеансе, исходная
переменная заменяется и более недоступна. Нельзя получить
доступ к переменной, указав имя модуля.
Кроме того, при вводе функции в командной строке и
последующем импорте функции с таким же именем исходная
функция заменяется и более недоступна.
ВЫПОЛНЕНИЕ СКРЫТЫХ КОМАНД
Некоторые команды можно выполнять, указывая свойства элемента,
которые отличают команду от других команд, имеющих то же имя.
Этот метод может использоваться для выполнения любых команд, но
он особенно удобен для запуска скрытых команд.
Используйте этот метод в качестве рекомендованного при написании
скриптов, которые должны получить широкое распространение,
поскольку невозможно предсказать, какие команды будет выполнены в
сеансе, в рамках которого должен запускаться скрипт.
ПОЛНЫЕ ИМЕНА
При запуске команд, которые были импортированы из оснастки
или модуля Windows PowerShell или из другого сеанса, можно
использовать полное имя команды, указав имя модуля или
оснастки, из которой добавлена команда.
Предусмотрена возможность формирования полных имен команд, но
для переменных или псевдонимов такой возможности нет.
Например, если командлет Get-Date из оснастки Microsoft.PowerS
hell.Utility скрывается псевдонимом, функцией или командлетом
с таким же именем, можно выполнить исходный командлет, указав
его полное имя (с учетом оснастки).
Microsoft.PowerShell.Utility\Get-Date
Для запуска команды New-Map, добавленной в модуле
MapFunctions, можно использовать ее полное имя (с учетом
имени модуля):
MapFunctions\New-Map
Для поиска оснастки или модуля, из которого была импортирована
команда, используйте следующий формат команды Get-Command:
get-command <имя_команды> | format-list -property Name,
PSSnapin, Module
Например, для поиска источника командлета Get-Date введите
следующую команду:
get-command get-date | format-list -property Name,
PSSnapin, Module
Имя : Get-Date
PSSnapIn : Microsoft.PowerShell.Utility
Module :
ОПЕРАТОР ВЫЗОВА
Кроме того, для выполнения любой команды, которую можно
получить с помощью команд Get-ChildItem (alias = dir),
Get-Command или Get-Module, можно использовать оператор
вызова (&).
Чтобы выполнить команду, заключите Get-Command в скобки и
используйте оператор вызова (&) для запуска команды.
&(get-command ...)
- или:
&(dir ... )
Например, если существует функция Map, которая была скрыта
псевдонимом Map, используйте следующую команду для запуска
функции.
&(get-command -name map -type function)
- или:
&(dir function:\map)
Для упрощения запуска скрытой команды можно также сохранить
ее в переменную.
Например, следующая команда сохраняет функцию Map в
переменной $myMap и затем использует оператор вызова для
запуска команды.
$myMap = (get-command -name map -type function)
&($myMap)
Если команда описана в модуле, можно использовать для ее
запуска следующий формат команды:
& <PSModuleInfo-object> <команда>
Например, для запуска командлета Add-File из модуля
FileCommands используйте следующую последовательность команд:
$FileCommands = get-module -name FileCommands
& $FileCommands Add-File
ЗАМЕНЕННЫЕ ЭЛЕМЕНТЫ
Элементы, которые не были импортированы в сеанс из модуля или
оснастки, такие как функции, переменные и псевдонимы, созданные в
сеансе или добавленные из профиля, могут быть заменены командами
с такими же именами. При замене элементов доступ к ним невозможен.
Переменные и псевдонимы заменяются всегда, даже если они были
импортированы из модуля или оснастки, поскольку доступ к ним с
использованием оператора вызова или полного имени невозможен.
Например, если в сеансе была создана функция Get-Map, а затем
была импортирована функция с именем Get-Map, исходная функция
заменяется и доступ к ней в текущем сеансе невозможен.
ПРЕДОТВРАЩЕНИЕ КОНФЛИКТОВ ИМЕН
Лучшим способом обработки конфликтов имен является их
предотвращение. При создании имен команд используйте очень
конкретные имена, которые с высокой вероятностью будут
уникальными. Например, добавляйте в имена команд свои инициалы
или сокращенное название компании.
Также при импорте команд в сеанс из модуля Windows PowerShell или
из другого сеанса используйте параметр Prefix командлета
Import-Module или Import-PSSession, чтобы добавить префикс к
именам команд.
Например, следующая команда позволяет предотвратить конфликты
между командлетами Get-Date и Set-Date, поставляемыми с Windows
PowerShell, при импорте модуля DateFunctions.
import-module -name DateFunctions -prefix ZZ
Дополнительные сведения см. в Import-Module и Import-PSSession.
СМ. ТАКЖЕ
about_Path_Syntax
about_Aliases
about_Functions
Alias (поставщик)
Function (поставщик)
Get-Command
Import-Module
Import-PSSession