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


about_Command_Precedence

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