РАЗДЕЛ 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