À propos de la priorité des commandesAbout Command Precedence

Description courteShort description

Décrit comment PowerShell détermine la commande à exécuter.Describes how PowerShell determines which command to run.

Description longueLong description

La priorité des commandes décrit la façon dont PowerShell détermine la commande à exécuter lorsqu’une session contient plusieurs commandes portant le même nom.Command precedence describes how PowerShell determines which command to run when a session contains more than one command with the same name. Les commandes d’une session peuvent être masquées ou remplacées par des commandes portant le même nom.Commands within a session can be hidden or replaced by commands with the same name. Cet article explique comment exécuter des commandes masquées et comment éviter les conflits de noms de commandes.This article shows you how to run hidden commands and how to avoid command-name conflicts.

Priorité des commandesCommand precedence

Lorsqu’une session PowerShell inclut plusieurs commandes portant le même nom, PowerShell détermine la commande à exécuter à l’aide des règles suivantes.When a PowerShell session includes more than one command that has the same name, PowerShell determines which command to run by using the following rules.

Si vous spécifiez le chemin d’accès à une commande, PowerShell exécute la commande à l’emplacement spécifié par le chemin d’accès.If you specify the path to a command, PowerShell runs the command at the location specified by the path.

Par exemple, la commande suivante exécute le script FindDocs.ps1 dans le répertoire « C : \ TechDocs » :For example, the following command runs the FindDocs.ps1 script in the "C:\TechDocs" directory:

C:\TechDocs\FindDocs.ps1

En tant que fonctionnalité de sécurité, PowerShell n’exécute pas les commandes exécutables (natives), y compris les scripts PowerShell, sauf si la commande se trouve dans un chemin d’accès qui est listé dans la variable d’environnement PATH $env:path ou si vous spécifiez le chemin d’accès au fichier de script.As a security feature, PowerShell does not run executable (native) commands, including PowerShell scripts, unless the command is located in a path that is listed in the Path environment variable $env:path or unless you specify the path to the script file.

Pour exécuter un script qui se trouve dans le répertoire actif, spécifiez le chemin d’accès complet ou tapez un point .\ pour représenter le répertoire actif.To run a script that is in the current directory, specify the full path, or type a dot .\ to represent the current directory.

Par exemple, pour exécuter le fichier FindDocs.ps1 dans le répertoire actif, tapez :For example, to run the FindDocs.ps1 file in the current directory, type:

.\FindDocs.ps1

Utilisation de caractères génériques dans l’exécutionUsing wildcards in execution

Vous pouvez utiliser des caractères génériques dans l’exécution de la commande.You may use wildcards in command execution. L’utilisation de caractères génériques est également appelée globbing .Using wildcard characters is also known as globbing .

PowerShell exécute un fichier avec une correspondance de caractère générique, avant qu’un littéral ne corresponde.PowerShell executes a file that has a wildcard match, before a literal match.

Prenons l’exemple d’un répertoire contenant les fichiers suivants :For example, consider a directory with the following files:

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

Les deux fichiers de script ont le même contenu : $MyInvocation.MyCommand.Path .Both script files have the same content: $MyInvocation.MyCommand.Path. Cette commande affiche le nom du script qui est appelé.This command displays the name of the script that is invoked.

Lorsque vous exécutez [a1].ps1 , le fichier a.ps1 est exécuté même si le fichier [a1].ps1 est une correspondance littérale.When you run [a1].ps1, the file a.ps1 is executed even though the file [a1].ps1 is a literal match.

C:\temp\test\[a1].ps1
C:\temp\test\a.ps1

À présent, nous allons supprimer le a.ps1 fichier et tenter de l’exécuter à nouveau.Now let's delete the a.ps1 file and attempt to run it again.

Remove-Item C:\temp\test\a.ps1
C:\temp\test\[a1].ps1
C:\temp\test\[a1].ps1

Vous pouvez voir à partir de la sortie qui [a1].ps1 s’exécute cette fois, car la correspondance littérale est la seule correspondance de fichier pour ce modèle de caractère générique.You can see from the output that [a1].ps1 runs this time because the literal match is the only file match for that wildcard pattern.

Pour plus d’informations sur la façon dont PowerShell utilise les caractères génériques, consultez about_Wildcards.For more information about how PowerShell uses wildcards, see about_Wildcards.

Notes

Pour limiter la recherche à un chemin d’accès relatif, vous devez faire précéder le nom du script du .\ chemin d’accès.To limit the search to a relative path, you must prefix the script name with the .\ path. Cela limite la recherche de commandes aux fichiers dans ce chemin d’accès relatif.This limits the search for commands to files in that relative path. Sans ce préfixe, d’autres syntaxes PowerShell peuvent entrer en conflit et il existe peu de garantie que le fichier sera trouvé.Without this prefix, other PowerShell syntax may conflict and there are few guarantees that the file will be found.

Si vous ne spécifiez pas de chemin d’accès, PowerShell utilise l’ordre de priorité suivant lorsqu’il exécute des commandes pour tous les éléments chargés dans la session active :If you do not specify a path, PowerShell uses the following precedence order when it runs commands for all items loaded in the current session:

  1. AliasAlias
  2. FonctionFunction
  3. Applet de commandeCmdlet
  4. Fichiers exécutables externes (programmes et scripts non-PowerShell)External executable files (programs and non-PowerShell scripts)

Par conséquent, si vous tapez « help », PowerShell recherche d’abord un alias nommé help , puis une fonction nommée Help et enfin une applet de commande nommée Help .Therefore, if you type "help", PowerShell first looks for an alias named help, then a function named Help, and finally a cmdlet named Help. Elle exécute le premier help élément qu’elle trouve.It runs the first help item that it finds.

Par exemple, si votre session contient une applet de commande et une fonction, toutes deux nommées Get-Map , lorsque vous tapez Get-Map , PowerShell exécute la fonction.For example, if your session contains a cmdlet and a function, both named Get-Map, when you type Get-Map, PowerShell runs the function.

Notes

Cela s’applique uniquement aux commandes chargées.This only applies to loaded commands. S’il existe un build exécutable et un alias build pour une fonction avec le nom de Invoke-Build à l’intérieur d’un module qui n’est pas chargé dans la session active, PowerShell exécute le build fichier exécutable à la place.If there is a build executable and an Alias build for a function with the name of Invoke-Build inside a module that is not loaded into the current session, PowerShell runs the build executable instead. Il ne charge pas les modules automatiquement s’il trouve l’exécutable externe dans ce cas.It does not auto-load modules if it finds the external executable in this case. C’est uniquement lorsqu’aucun exécutable externe n’est trouvé qu’un alias, une fonction ou une applet de commande avec le nom donné est appelé, ce qui déclenche le chargement automatique de son module.It is only when no external executable is found that an alias, function, or cmdlet with the given name is invoked, thereby triggering auto-loading of its module.

Lorsque la session contient des éléments du même type qui ont le même nom, PowerShell exécute l’élément le plus récent.When the session contains items of the same type that have the same name, PowerShell runs the newer item.

Par exemple, si vous importez une autre Get-Date applet de commande à partir d’un module, lorsque vous tapez Get-Date , PowerShell exécute la version importée sur le natif.For example, if you import another Get-Date cmdlet from a module, when you type Get-Date, PowerShell runs the imported version over the native one.

Éléments masqués et remplacésHidden and replaced items

À la suite de ces règles, les éléments peuvent être remplacés ou masqués par des éléments portant le même nom.As a result of these rules, items can be replaced or hidden by items with the same name.

Les éléments sont « masqués » ou « occultés » si vous pouvez toujours accéder à l’élément d’origine, par exemple en qualifiant le nom de l’élément avec un nom de module ou de composant logiciel enfichable.Items are "hidden" or "shadowed" if you can still access the original item, such as by qualifying the item name with a module or snap-in name.

Par exemple, si vous importez une fonction qui porte le même nom qu’une applet de commande dans la session, l’applet de commande est masquée (mais pas remplacée), car elle a été importée à partir d’un composant logiciel enfichable ou d’un module.For example, if you import a function that has the same name as a cmdlet in the session, the cmdlet is hidden (but not replaced) because it was imported from a snap-in or module.

Les éléments sont « remplacés » ou « remplacés » si vous ne pouvez plus accéder à l’élément d’origine.Items are "replaced" or "overwritten" if you can no longer access the original item.

Par exemple, si vous importez une variable qui porte le même nom qu’une variable de la session, la variable d’origine est remplacée et n’est plus accessible.For example, if you import a variable that has the same name as a variable in the session, the original variable is replaced and is no longer accessible. Vous ne pouvez pas qualifier une variable avec un nom de module.You cannot qualify a variable with a module name.

De même, si vous tapez une fonction sur la ligne de commande, puis que vous importez une fonction portant le même nom, la fonction d’origine est remplacée et n’est plus accessible.Also, if you type a function at the command line and then import a function with the same name, the original function is replaced and is no longer accessible.

Recherche de commandes masquéesFinding hidden commands

Le paramètre All de l’applet de commande obtenir-Command obtient toutes les commandes portant le nom spécifié, même si elles sont masquées ou remplacées.The All parameter of the Get-Command cmdlet gets all commands with the specified name, even if they are hidden or replaced. À compter de PowerShell 3,0, par défaut, Get-Command obtient uniquement les commandes qui s’exécutent lorsque vous tapez le nom de la commande.Beginning in PowerShell 3.0, by default, Get-Command gets only the commands that run when you type the command name.

Dans les exemples suivants, la session comprend une Get-Date fonction et une applet de commande « obtenir-date » .In the following examples, the session includes a Get-Date function and a Get-Date cmdlet.

La commande suivante obtient la Get-Date commande qui s’exécute lorsque vous tapez Get-Date .The following command gets the Get-Date command that runs when you type Get-Date.

Get-Command Get-Date
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date

La commande suivante utilise le paramètre All pour récupérer toutes les Get-Date commandes.The following command uses the All parameter to get all Get-Date commands.

Get-Command Get-Date -All
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date
Cmdlet          Get-Date                  Microsoft.PowerShell.Utility

Exécution de commandes masquéesRunning hidden commands

Vous pouvez exécuter des commandes particulières en spécifiant des propriétés d’élément qui distinguent la commande des autres commandes qui peuvent avoir le même nom.You can run particular commands by specifying item properties that distinguish the command from other commands that might have the same name. Vous pouvez utiliser cette méthode pour exécuter une commande, mais elle est particulièrement utile pour exécuter des commandes masquées.You can use this method to run any command, but it is especially useful for running hidden commands.

Noms qualifiésQualified names

L’utilisation du nom qualifié du module d’une applet de commande vous permet d’exécuter des commandes masquées par un élément portant le même nom.Using the module-qualified name of a cmdlet allows you to run commands hidden by an item with the same name. Par exemple, vous pouvez exécuter l' Get-Date applet de commande en la qualifiant avec son nom de module Microsoft. PowerShell. Utility .For example, you can run the Get-Date cmdlet by qualifying it with its module name Microsoft.PowerShell.Utility .

Utilisez cette méthode préférée lorsque vous écrivez des scripts que vous envisagez de distribuer.Use this preferred method when writing scripts that you intend to distribute. Vous ne pouvez pas prédire les commandes qui peuvent être présentes dans la session dans laquelle le script s’exécute.You cannot predict which commands might be present in the session in which the script runs.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, September 4, 2018 8:17:25 AM

Pour exécuter une New-Map commande qui a été ajoutée par le MapFunctions module, utilisez son nom qualifié de module :To run a New-Map command that was added by the MapFunctions module, use its module-qualified name:

MapFunctions\New-Map

Pour rechercher le module à partir duquel une commande a été importée, utilisez la propriété modulename des commandes.To find the module from which a command was imported, use the ModuleName property of commands.

(Get-Command <command-name>).ModuleName

Par exemple, pour trouver la source de l' Get-Date applet de commande, tapez :For example, to find the source of the Get-Date cmdlet, type:

(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility

Notes

Vous ne pouvez pas qualifier de variables ou d’alias.You cannot qualify variables or aliases.

Opérateur d’appelCall operator

Vous pouvez également utiliser l' Call opérateur & pour exécuter des commandes masquées en les associant à un appel à la commande obtenir-ChildItem (l’alias est « dir ») ou à l’opération « Get-Command obtenir-module».You can also use the Call operator & to run hidden commands by combining it with a call to Get-ChildItem (the alias is "dir"), Get-Command or Get-Module.

L’opérateur d’appel exécute des chaînes et des blocs de script dans une étendue enfant.The call operator executes strings and script blocks in a child scope. Pour plus d’informations, consultez about_Operators.For more information, see about_Operators.

Par exemple, si vous avez une fonction nommée Map qui est masquée par un alias nommé Map , utilisez la commande suivante pour exécuter la fonction.For example, if you have a function named Map that is hidden by an alias named Map, use the following command to run the function.

&(Get-Command -Name Map -CommandType Function)

ouor

&(dir Function:\map)

Vous pouvez également enregistrer votre commande masquée dans une variable pour faciliter son exécution.You can also save your hidden command in a variable to make it easier to run.

Par exemple, la commande suivante enregistre la Map fonction dans la $myMap variable, puis utilise l' Call opérateur pour l’exécuter.For example, the following command saves the Map function in the $myMap variable and then uses the Call operator to run it.

$myMap = (Get-Command -Name map -CommandType function)
&($myMap)

Éléments remplacésReplaced items

Un élément « remplacé » est un élément auquel vous ne pouvez plus accéder.A "replaced" item is one that you can no longer access. Vous pouvez remplacer des éléments en important des éléments portant le même nom à partir d’un module ou d’un composant logiciel enfichable.You can replace items by importing items of the same name from a module or snap-in.

Par exemple, si vous tapez une Get-Map fonction dans votre session et que vous importez une fonction appelée Get-Map , elle remplace la fonction d’origine.For example, if you type a Get-Map function in your session, and you import a function called Get-Map, it replaces the original function. Vous ne pouvez pas le récupérer dans la session active.You cannot retrieve it in the current session.

Les variables et les alias ne peuvent pas être masqués, car vous ne pouvez pas utiliser un opérateur d’appel ou un nom qualifié pour les exécuter.Variables and aliases cannot be hidden because you cannot use a call operator or a qualified name to run them. Lorsque vous importez des variables et des alias à partir d’un module ou d’un composant logiciel enfichable, ils remplacent les variables dans la session portant le même nom.When you import variables and aliases from a module or snap-in, they replace variables in the session with the same name.

Éviter les conflits de nomsAvoiding name conflicts

La meilleure façon de gérer les conflits de noms de commande consiste à les empêcher.The best way to manage command name conflicts is to prevent them. Lorsque vous nommez vos commandes, utilisez un nom unique.When you name your commands, use a unique name. Par exemple, ajoutez vos initiales ou acronyme de nom de société aux noms de vos commandes.For example, add your initials or company name acronym to the nouns in your commands.

En outre, lorsque vous importez des commandes dans votre session à partir d’un module PowerShell ou d’une autre session, utilisez le Prefix paramètre de la commande import-module ouAlso, when you import commands into your session from a PowerShell module or from another session, use the Prefix parameter of the Import-Module or

Applet de commande Import-PSSession pour ajouter un préfixe aux noms des commandes.Import-PSSession cmdlet to add a prefix to the nouns in the names of commands.

Par exemple, la commande suivante évite tout conflit avec les Get-Date applets de commande et Set-Date fournies avec PowerShell lorsque vous importez le DateFunctions module.For example, the following command avoids any conflict with the Get-Date and Set-Date cmdlets that come with PowerShell when you import the DateFunctions module.

Import-Module -Name DateFunctions -Prefix ZZ

Pour plus d’informations, consultez Import-Module et Import-PSSession ci-dessous.For more information, see Import-Module and Import-PSSession below.

Voir aussiSee also