О приоритете команд
Краткое описание
Описывает, как PowerShell определяет, какую команду следует выполнить.
Подробное описание
Приоритет команд описывает, как PowerShell определяет, какая команда будет выполняться, если сеанс содержит несколько команд с одинаковыми именами. Команды в сеансе могут быть скрыты или заменены командами с тем же именем. В этой статье показано, как выполнять скрытые команды и как избежать конфликтов имен команд.
Приоритет команд
Если сеанс PowerShell содержит несколько команд с одинаковыми именами, PowerShell определяет, какую команду следует выполнить, используя следующие правила.
Если указать путь к команде, PowerShell выполняет команду в расположении, указанном путем.
Например, следующая команда запускает скрипт FindDocs.ps1 в каталоге C:\TechDocs:
C:\TechDocs\FindDocs.ps1
В качестве функции безопасности PowerShell не выполняет исполняемые (собственные) команды, включая скрипты PowerShell, если команда не находится в пути, указанном в переменной $env:path
среды Path, или если не указан путь к файлу скрипта.
Чтобы запустить скрипт в текущем каталоге, укажите полный путь или введите точку .\
для представления текущего каталога.
Например, чтобы запустить файл FindDocs.ps1 в текущем каталоге, введите:
.\FindDocs.ps1
Использование подстановочных знаков при выполнении
При выполнении команд можно использовать подстановочные знаки. Использование подстановочных знаков также называется globbing.
PowerShell выполняет файл с подстановочными знаками перед литеральным совпадением.
Например, рассмотрим каталог со следующими файлами:
Get-ChildItem C:\temp\test
Directory: C:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 5/20/2019 2:29 PM 28 a.ps1
-a---- 5/20/2019 2:29 PM 28 [a1].ps1
Оба файла скрипта имеют одинаковое содержимое: $MyInvocation.MyCommand.Path
.
Эта команда отображает имя вызываемого скрипта.
При запуске [a1].ps1
файл a.ps1
выполняется, даже если файл [a1].ps1
является литеральным совпадением.
C:\temp\test\[a1].ps1
C:\temp\test\a.ps1
Теперь давайте удалим a.ps1
файл и попытаемся запустить его снова.
Remove-Item C:\temp\test\a.ps1
C:\temp\test\[a1].ps1
C:\temp\test\[a1].ps1
В выходных данных, которые выполняются на этот раз, можно увидеть, [a1].ps1
так как совпадение с литералами является единственным совпадением файла для этого шаблона с подстановочными знаками.
Дополнительные сведения о том, как PowerShell использует подстановочные знаки, см. в разделе about_Wildcards.
Примечание
Чтобы ограничить поиск относительным путем, необходимо ввести в имя скрипта .\
префикс пути. Это ограничивает поиск команд файлами по этому относительному пути. Без этого префикса другие синтаксисы PowerShell могут конфликтовать, и существует несколько гарантий того, что файл будет найден.
Если путь не указан, PowerShell использует следующий порядок очередности при выполнении команд:
- Псевдоним
- Функция
- Командлет
- Собственные команды Windows
Таким образом, если ввести "help", PowerShell сначала ищет псевдоним с именем help
, затем функцию с именем Help
и, наконец, командлет с именем Help
. Он запускает первый help
элемент, который он находит.
Например, если сеанс содержит командлет и функцию с именем Get-Map
, при вводе Get-Map
powerShell выполняет функцию .
Если сеанс содержит элементы того же типа с одинаковым именем, PowerShell запускает новый элемент.
Например, при импорте другого Get-Date
командлета из модуля при вводе Get-Date
PowerShell выполняет импортированную версию по сравнению с собственной.
Скрытые и замененные элементы
Благодаря этим правилам элементы могут быть заменены или скрыты элементами с тем же именем.
Элементы будут "скрытыми" или "затеняемыми", если вы по-прежнему можете получить доступ к исходному элементу, например путем указания имени элемента с помощью имени модуля или оснастки.
Например, при импорте функции, имя которой совпадает с именем командлета в сеансе, командлет будет скрыт (но не заменен), так как он был импортирован из оснастки или модуля.
Элементы будут заменены или перезаписаны, если вы больше не можете получить доступ к исходному элементу.
Например, при импорте переменной с тем же именем, что и переменная в сеансе, исходная переменная заменяется и становится недоступной. Нельзя указать переменную с именем модуля.
Кроме того, если ввести функцию в командной строке, а затем импортировать функцию с тем же именем, исходная функция будет заменена и больше не будет доступна.
Поиск скрытых команд
Параметр All командлета Get-Command получает все команды с указанным именем, даже если они скрыты или заменены. Начиная с PowerShell 3.0, по умолчанию получает только команды, Get-Command
которые выполняются при вводе имени команды.
В следующих примерах сеанс включает функцию Get-Date
и командлет Get-Date .
Следующая команда возвращает Get-Date
команду, которая выполняется при вводе Get-Date
.
Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
Следующая команда использует параметр All для получения всех Get-Date
команд.
Get-Command Get-Date -All
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
Cmdlet Get-Date Microsoft.PowerShell.Utility
Выполнение скрытых команд
Вы можете выполнять определенные команды, указав свойства элемента, которые отличают команду от других команд, которые могут иметь то же имя. Этот метод можно использовать для выполнения любой команды, но он особенно полезен для выполнения скрытых команд.
Полные имена
С помощью имени модуля командлета можно выполнять команды, скрытые элементом с таким же именем. Например, можно запустить Get-Date
командлет, указав в нем имя модуля Microsoft.PowerShell.Utility.
Используйте этот предпочтительный метод при написании скриптов, которые планируется распространять. Невозможно предсказать, какие команды могут присутствовать в сеансе, в котором выполняется скрипт.
New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, September 4, 2018 8:17:25 AM
Чтобы выполнить New-Map
команду, добавленную модулем MapFunctions
, используйте имя модуля:
MapFunctions\New-Map
Чтобы найти модуль, из которого была импортирована команда, используйте свойство ModuleName команд.
(Get-Command <command-name>).ModuleName
Например, чтобы найти источник командлета, введите Get-Date
:
(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
Примечание
Нельзя квалифицировать переменные или псевдонимы.
Оператор вызова
Оператор &
также можно использовать для Call
выполнения скрытых команд, объединяя его с вызовом Get-ChildItem (псевдоним — dir) Get-Command
или Get-Module.
Оператор вызова выполняет строки и блоки скриптов в дочернем область. Дополнительные сведения см. в разделе about_Operators.
Например, если у вас есть функция с именем Map
, скрытая псевдонимом Map
, используйте следующую команду для запуска функции.
&(Get-Command -Name Map -CommandType Function)
или
&(dir Function:\map)
Вы также можете сохранить скрытую команду в переменной, чтобы упростить выполнение.
Например, следующая команда сохраняет функцию Map
в переменной $myMap
, а затем использует Call
оператор для ее выполнения.
$myMap = (Get-Command -Name map -CommandType function)
&($myMap)
Замененные элементы
Замененный элемент — это элемент, доступ к которому больше недоступен. Вы можете заменить элементы, импортировав элементы с тем же именем из модуля или оснастки.
Например, если вы вводите Get-Map
функцию в сеансе и импортируете функцию с именем Get-Map
, она заменяет исходную функцию. Вы не можете получить его в текущем сеансе.
Переменные и псевдонимы не могут быть скрыты, так как для их выполнения нельзя использовать оператор вызова или полное имя. При импорте переменных и псевдонимов из модуля или оснастки они заменяют переменные в сеансе тем же именем.
Предотвращение конфликтов имен
Лучший способ управления конфликтами имен команд — предотвратить их. При присвоении имени командам используйте уникальное имя. Например, добавьте свои инициалы или аббревиатуру названия компании к существительным в командах.
Кроме того, при импорте команд в сеанс из модуля PowerShell или другого сеанса используйте Prefix
параметр Import-Module или
Командлет Import-PSSession для добавления префикса к существительным в именах команд.
Например, следующая команда позволяет избежать конфликтов с Get-Date
командлетами и Set-Date
, которые поставляются с PowerShell при импорте DateFunctions
модуля.
Import-Module -Name DateFunctions -Prefix ZZ
Дополнительные сведения см. в разделе Import-Module
и Import-PSSession
ниже.