about_Command_Precedence
Description courte
Décrit comment PowerShell détermine la commande à exécuter.
Description longue
La priorité des commandes décrit comment PowerShell détermine la commande à exécuter lorsqu’une session contient plusieurs commandes portant le même nom. Les commandes d’une session peuvent être masquées ou remplacées par des commandes portant le même nom. Cet article explique comment exécuter des commandes masquées et comment éviter les conflits de nom de commande.
Priorité des commandes
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.
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.
Par exemple, la commande suivante exécute le script FindDocs.ps1 dans le C:\TechDocs
répertoire :
C:\TechDocs\FindDocs.ps1
Vous pouvez exécuter n’importe quelle commande exécutable à l’aide de son chemin d’accès complet. En tant que fonctionnalité de sécurité, PowerShell n’exécute pas de commandes exécutables, y compris les scripts PowerShell et les commandes natives, sauf si la commande se trouve dans un chemin d’accès répertorié dans la $env:Path
variable d’environnement.
Pour exécuter un fichier exécutable qui se trouve dans le répertoire actif, spécifiez le chemin d’accès complet ou utilisez le chemin .\
relatif pour représenter le répertoire actif.
Par exemple, pour exécuter le FindDocs.ps1
fichier dans le répertoire actif, tapez :
.\FindDocs.ps1
Si vous ne spécifiez pas de chemin d’accès, PowerShell utilise l’ordre de priorité suivant lorsqu’il exécute des commandes.
- Alias
- Fonction
- Applet de commande (voir Résolution du nom de l’applet de commande)
- Fichiers exécutables externes (y compris les fichiers de script PowerShell)
Par conséquent, si vous tapez help
, PowerShell recherche d’abord un alias nommé help
, une fonction nommée Help
, et enfin une applet de commande nommée Help
. Il exécute le premier help
élément qu’il trouve.
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.
Remarque
Cela s’applique uniquement aux commandes chargées. S’il existe un build
exécutable et un alias build
pour une fonction portant le nom d’un Invoke-Build
module qui n’est pas chargé dans la session active, PowerShell exécute l’exécutable à la build
place. Il ne charge pas automatiquement les modules s’il trouve l’exécutable externe. Ce n’est que lorsqu’aucun exécutable externe n’est trouvé qu’un alias, une fonction ou une applet de commande portant le nom donné est appelé.
Résolution des éléments portant les mêmes noms
À 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.
Les éléments sont masqués ou masqués si vous pouvez toujours accéder à l’élément d’origine, par exemple en qualifier le nom de l’élément avec un nom de module.
Par exemple, si vous importez une fonction portant le même nom qu’une applet de commande dans la session, l’applet de commande est masquée, mais pas remplacée. Vous pouvez exécuter l’applet de commande en spécifiant son nom qualifié de module.
Lorsque les éléments sont remplacés ou remplacés, vous ne pouvez plus accéder à l’élément d’origine.
Par exemple, si vous importez une variable portant le même nom qu’une variable dans la session, la variable d’origine est remplacée. Vous ne pouvez pas qualifier une variable avec un nom de module.
Si vous créez une fonction sur la ligne de commande, puis importez une fonction portant le même nom, la fonction d’origine est remplacée.
Recherche de commandes masquées
Le paramètre All de l’applet de commande Get-Command obtient toutes les commandes portant le nom spécifié, même si elles sont masquées ou remplacées. À 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.
Dans les exemples suivants, la session inclut une Get-Date
fonction et une applet de commande Get-Date . Vous pouvez utiliser Get-Command
pour déterminer la commande choisie en premier.
Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
Utilise le paramètre All pour répertorier les commandes disponibles Get-Date
.
Get-Command Get-Date -All
CommandType Name Version Source
----------- ---- ------- ------
Function Get-Date
Cmdlet Get-Date 7.0.0.0 Microsoft.PowerShell.Utility
Get-Command where -All
CommandType Name Version Source
----------- ---- ------- ------
Alias where -> Where-Object
Application where.exe 10.0.22621.1 C:\Windows\system32\where.exe
Vous pouvez exécuter des commandes particulières en incluant des informations éligibles qui distinguent la commande d’autres commandes qui peuvent avoir le même nom.
Pour les applets de commande, vous pouvez utiliser le nom qualifié du module. Pour les exécutables, vous pouvez inclure l’extension de fichier. Par exemple, pour exécuter la version exécutable d’utilisation where
where.exe
.
Utiliser des noms qualifiés de module
L’utilisation du nom qualifié de module d’une applet de commande vous permet d’exécuter des commandes masquées par un élément portant le même nom. Par exemple, vous pouvez exécuter l’applet Get-Date
de commande en la qualifier avec son nom de module Microsoft.PowerShell.Utility ou son chemin d’accès. Lorsque vous utilisez des noms qualifiés de module, le module peut être importé automatiquement dans la session en fonction de la valeur de $PSModuleAutoLoadingPreference
.
Remarque
Vous ne pouvez pas utiliser de noms de module pour qualifier des variables ou des alias.
L’utilisation de noms qualifiés de module garantit que vous exécutez la commande que vous avez l’intention d’exécuter. Il s’agit de la méthode recommandée pour appeler des applets de commande lors de l’écriture de scripts que vous envisagez de distribuer.
L’exemple suivant montre comment qualifier une commande en incluant son nom de module.
Important
La qualification de module utilise la barre oblique inverse (\
) pour séparer le nom du module du nom de la commande, quelle que soit la plateforme.
New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM
Pour exécuter une New-Map
commande à partir du MapFunctions
module, utilisez son nom qualifié de module :
MapFunctions\New-Map
Pour rechercher le module à partir duquel une commande a été importée, utilisez la propriété ModuleName des commandes.
(Get-Command <command-name>).ModuleName
Par exemple, pour rechercher la source de l’applet Get-Date
de commande, tapez :
(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
Si vous souhaitez qualifier le nom de la commande à l’aide du chemin d’accès au module, vous devez utiliser la barre oblique (/
) comme séparateur de chemin d’accès et le caractère de barre oblique inverse (\
) avant le nom de la commande. Utilisez l’exemple suivant pour exécuter l’applet de Get-Date
commande :
//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Le chemin d’accès peut être un chemin complet ou un chemin d’accès relatif à l’emplacement actuel.
Sur Windows, vous ne pouvez pas utiliser de chemin qualifié de lecteur. Vous devez utiliser un chemin UNC, comme indiqué dans l’exemple précédent, ou un chemin relatif au lecteur actuel.
L’exemple suivant suppose que votre emplacement actuel se trouve dans le C:
lecteur.
/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Utiliser l’opérateur d’appel
Vous pouvez également utiliser l’opérateur d’appel (&
) pour exécuter des commandes masquées en la combinant avec un appel à Get-ChildItem (l’alias est dir
) Get-Command
ou Get-Module.
L’opérateur d’appel exécute des chaînes et des blocs de script dans une étendue enfant. Pour plus d’informations, consultez about_Operators.
Par exemple, utilisez la commande suivante pour exécuter la fonction nommée Map
masquée par un alias nommé Map
.
& (Get-Command -Name Map -CommandType Function)
or
& (dir Function:\map)
Vous pouvez également enregistrer votre commande masquée dans une variable pour faciliter l’exécution.
Par exemple, la commande suivante enregistre la Map
fonction dans la $myMap
variable, puis utilise l’opérateur Call
pour l’exécuter.
$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)
Éléments remplacés
Un élément remplacé est un élément auquel vous ne pouvez plus accéder. Vous pouvez remplacer les éléments en important les éléments du même nom à partir d’un module.
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. Vous ne pouvez pas la récupérer dans la session active.
Les variables et les alias ne peuvent pas être masqués, car vous ne pouvez pas utiliser d’opérateur d’appel ou un nom qualifié pour les exécuter. Lorsque vous importez des variables et des alias à partir d’un module, ils remplacent les variables dans la session par le même nom.
Résolution de noms d’applet de commande
Lorsque vous n’utilisez pas le nom qualifié d’une applet de commande, PowerShell vérifie si l’applet de commande est chargée dans la session active. S’il existe plusieurs modules chargés qui contiennent le même nom d’applet de commande, PowerShell utilise l’applet de commande du premier module trouvé par ordre alphabétique.
Si l’applet de commande n’est pas chargée, PowerShell recherche les modules installés et charge automatiquement le premier module qui contient l’applet de commande et exécute cette applet de commande.
PowerShell recherche des modules dans chaque chemin défini dans la variable d’environnement $env:PSModulePath
. Les chemins d’accès sont recherchés dans l’ordre dans lequel ils sont répertoriés dans la variable. Dans chaque chemin, les modules sont recherchés par ordre alphabétique. PowerShell utilise l’applet de commande à partir de la première correspondance qu’elle trouve.
Éviter les conflits de noms
La meilleure façon de gérer les conflits de noms de commandes consiste à les empêcher. Lorsque vous nommez vos commandes, utilisez un nom unique. Par exemple, ajoutez vos initiales ou votre acronyme de nom de société aux noms dans vos commandes.
Lorsque vous importez des commandes dans votre session à partir d’un module PowerShell ou d’une autre session, vous pouvez utiliser le Prefix
paramètre de l’applet de commande Import-Module ou Import-PSSession pour ajouter un préfixe aux noms des commandes.
Par exemple, la commande suivante évite tout conflit avec les Get-Date
Set-Date
applets de commande fournies avec PowerShell lorsque vous importez le DateFunctions
module.
Import-Module -Name DateFunctions -Prefix ZZ
Exécution d’exécutables externes
Sur Windows. PowerShell traite les extensions de fichier répertoriées dans la variable d’environnement $env:PATHEXT
en tant que fichiers exécutables. Les fichiers qui ne sont pas des exécutables Windows sont transmis à Windows pour traiter. Windows recherche l’association de fichiers et exécute le verbe Windows Shell par défaut pour l’extension. Pour que Windows puisse prendre en charge l’exécution par extension de fichier, l’association doit être inscrite auprès du système.
Vous pouvez inscrire le moteur exécutable pour une extension de fichier à l’aide des ftype
commandes et assoc
commandes de l’interpréteur de commandes CMD. PowerShell n’a aucune méthode directe pour inscrire le gestionnaire de fichiers. Pour plus d’informations, consultez la documentation de la commande ftype .
Pour que PowerShell affiche une extension de fichier comme exécutable dans la session active, vous devez ajouter l’extension à la variable d’environnement $env:PATHEXT
.