Поделиться через


О приоритете команд

Краткое описание

Описывает, как 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 использует следующий порядок очередности при выполнении команд:

  1. Псевдоним
  2. Функция
  3. Командлет
  4. Собственные команды Windows

Таким образом, если ввести "help", PowerShell сначала ищет псевдоним с именем help, затем функцию с именем Helpи, наконец, командлет с именем Help. Он запускает первый help элемент, который он находит.

Например, если сеанс содержит командлет и функцию с именем Get-Map, при вводе Get-MappowerShell выполняет функцию .

Если сеанс содержит элементы того же типа с одинаковым именем, PowerShell запускает новый элемент.

Например, при импорте другого Get-Date командлета из модуля при вводе Get-DatePowerShell выполняет импортированную версию по сравнению с собственной.

Скрытые и замененные элементы

Благодаря этим правилам элементы могут быть заменены или скрыты элементами с тем же именем.

Элементы будут "скрытыми" или "затеняемыми", если вы по-прежнему можете получить доступ к исходному элементу, например путем указания имени элемента с помощью имени модуля или оснастки.

Например, при импорте функции, имя которой совпадает с именем командлета в сеансе, командлет будет скрыт (но не заменен), так как он был импортирован из оснастки или модуля.

Элементы будут заменены или перезаписаны, если вы больше не можете получить доступ к исходному элементу.

Например, при импорте переменной с тем же именем, что и переменная в сеансе, исходная переменная заменяется и становится недоступной. Нельзя указать переменную с именем модуля.

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

Поиск скрытых команд

Параметр 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 ниже.

См. также раздел