about_Command_Precedence

Descripción breve

Describe cómo PowerShell determina qué comando se va a ejecutar.

Descripción larga

La precedencia de comandos describe cómo PowerShell determina qué comando ejecutar cuando una sesión contiene más de un comando con el mismo nombre. Los comandos de una sesión se pueden ocultar o reemplazar por comandos con el mismo nombre. En este artículo se muestra cómo ejecutar comandos ocultos y cómo evitar conflictos de nombres de comando.

Precedencia de comandos

Cuando una sesión de PowerShell incluye más de un comando que tiene el mismo nombre, PowerShell determina qué comando ejecutar con las reglas siguientes.

Si especifica la ruta de acceso a un comando, PowerShell ejecuta el comando en la ubicación especificada por la ruta de acceso.

Por ejemplo, el siguiente comando ejecuta el script FindDocs.ps1 en el C:\TechDocs directorio :

C:\TechDocs\FindDocs.ps1

Puede ejecutar cualquier comando ejecutable mediante su ruta de acceso completa. Como característica de seguridad, PowerShell no ejecuta comandos ejecutables, incluidos scripts de PowerShell y comandos nativos, a menos que el comando se encuentre en una ruta de acceso que aparece en la $env:Path variable de entorno.

Para ejecutar un archivo ejecutable que se encuentra en el directorio actual, especifique la ruta de acceso completa o use la ruta de acceso .\ relativa para representar el directorio actual.

Por ejemplo, para ejecutar el FindDocs.ps1 archivo en el directorio actual, escriba:

.\FindDocs.ps1

Si no especifica una ruta de acceso, PowerShell usa el siguiente orden de precedencia cuando ejecuta comandos.

  1. Alias
  2. Función
  3. Cmdlet (consulte Resolución de nombres de cmdlet)
  4. Archivos ejecutables externos (incluidos los archivos de script de PowerShell)

Por lo tanto, si escribe help, PowerShell busca primero un alias denominado , una función denominada helpHelpy, por último, un cmdlet denominado Help. Ejecuta el primer help elemento que encuentra.

Por ejemplo, si la sesión contiene un cmdlet y una función, ambas denominadas Get-Map, cuando escribe Get-Map, PowerShell ejecuta la función.

Nota:

Esto solo se aplica a los comandos cargados. Si hay un build archivo ejecutable y un alias build para una función con el nombre de dentro de Invoke-Build un módulo que no se carga en la sesión actual, PowerShell ejecuta el build ejecutable en su lugar. No carga automáticamente los módulos si encuentra el ejecutable externo. Solo es cuando no se encuentra ningún archivo ejecutable externo que se invoque un alias, una función o un cmdlet con el nombre especificado.

Resolución de elementos con los mismos nombres

Como resultado de estas reglas, los elementos se pueden reemplazar u ocultar por elementos con el mismo nombre.

Los elementos están ocultos o sombreados si todavía puede tener acceso al elemento original, por ejemplo, calificando el nombre del elemento con un nombre de módulo.

Por ejemplo, si importa una función que tiene el mismo nombre que un cmdlet en la sesión, el cmdlet se oculta, pero no se reemplaza. Puede ejecutar el cmdlet especificando su nombre completo del módulo.

Cuando los elementos se reemplazan o se sobrescriben, ya no se puede tener acceso al elemento original.

Por ejemplo, si importa una variable que tiene el mismo nombre que una variable en la sesión, se reemplaza la variable original. No se puede calificar una variable con un nombre de módulo.

Si crea una función en la línea de comandos y, a continuación, importa una función con el mismo nombre, se reemplaza la función original.

Búsqueda de comandos ocultos

El parámetro All del cmdlet Get-Command obtiene todos los comandos con el nombre especificado, incluso si están ocultos o reemplazados. A partir de PowerShell 3.0, de forma predeterminada, Get-Command obtiene solo los comandos que se ejecutan al escribir el nombre del comando.

En los ejemplos siguientes, la sesión incluye una Get-Date función y un cmdlet Get-Date . Puede usar Get-Command para determinar qué comando se elige primero.

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

Usa el parámetro All para enumerar los comandos 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

Puede ejecutar comandos concretos mediante la inclusión de información apta que distingue el comando de otros comandos que podrían tener el mismo nombre. En el caso de los cmdlets, puede usar el nombre completo del módulo. En el caso de los ejecutables, puede incluir la extensión de archivo. Por ejemplo, para ejecutar la versión ejecutable de uso where.exede where .

Uso de nombres calificados para módulos

El uso del nombre completo del módulo de un cmdlet permite ejecutar comandos ocultos por un elemento con el mismo nombre. Por ejemplo, puede ejecutar el Get-Date cmdlet si lo califica con su nombre de módulo Microsoft.PowerShell.Utility o su ruta de acceso. Cuando se usan nombres calificados para módulos, el módulo se puede importar automáticamente en la sesión en función del valor de $PSModuleAutoLoadingPreference.

Nota:

No puede usar nombres de módulo para calificar variables o alias.

El uso de nombres completos de módulo garantiza que está ejecutando el comando que pretende ejecutar. Este es el método recomendado para llamar a cmdlets al escribir scripts que se van a distribuir.

En el ejemplo siguiente se muestra cómo calificar un comando mediante la inclusión de su nombre de módulo.

Importante

La calificación del módulo usa el carácter de barra diagonal inversa (\) para separar el nombre del módulo del nombre del comando, independientemente de la plataforma.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM

Para ejecutar un New-Map comando desde el MapFunctions módulo, use su nombre completo del módulo:

MapFunctions\New-Map

Para buscar el módulo desde el que se importó un comando, use la propiedad ModuleName de los comandos.

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

Por ejemplo, para buscar el origen del Get-Date cmdlet, escriba:

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

Si desea calificar el nombre del comando mediante la ruta de acceso al módulo, debe usar la barra diagonal (/) como separador de ruta de acceso y el carácter de barra diagonal inversa (\) antes del nombre del comando. Use el ejemplo siguiente para ejecutar el Get-Date cmdlet :

//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

La ruta de acceso puede ser una ruta de acceso completa o una ruta de acceso relativa a la ubicación actual. En Windows, no se puede usar una ruta de acceso calificada por la unidad. Debe usar una ruta de acceso UNC, como se muestra en el ejemplo anterior, o una ruta de acceso relativa a la unidad actual. En el ejemplo siguiente se supone que la ubicación actual está en la C: unidad.

/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

Uso del operador de llamada

También puede usar el operador de llamada (&) para ejecutar comandos ocultos si lo combina con una llamada a Get-ChildItem (el alias es dir) Get-Command o Get-Module.

El operador de llamada ejecuta cadenas y bloques de script en un ámbito secundario. Para obtener más información, consulte about_Operators.

Por ejemplo, use el comando siguiente para ejecutar la función denominada Map oculta por un alias denominado Map.

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

o

& (dir Function:\map)

También puede guardar el comando oculto en una variable para facilitar la ejecución.

Por ejemplo, el siguiente comando guarda la Map función en la $myMap variable y, a continuación, usa el Call operador para ejecutarla.

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

Elementos reemplazados

Un elemento reemplazado es aquel al que ya no se puede acceder. Puede reemplazar elementos importando elementos del mismo nombre desde un módulo.

Por ejemplo, si escribe una Get-Map función en la sesión e importa una función denominada Get-Map, reemplaza la función original. No se puede recuperar en la sesión actual.

Las variables y alias no se pueden ocultar porque no se puede usar un operador de llamada ni un nombre completo para ejecutarlas. Al importar variables y alias de un módulo, reemplazan las variables de la sesión por el mismo nombre.

Resolución de nombres de cmdlet

Cuando no se usa el nombre completo de un cmdlet, PowerShell comprueba si el cmdlet se carga en la sesión actual. Si hay varios módulos cargados que contienen el mismo nombre de cmdlet, PowerShell usa el cmdlet del primer módulo encontrado alfabéticamente.

Si el cmdlet no se carga, PowerShell busca en los módulos instalados y carga automáticamente el primer módulo que contiene el cmdlet y ejecuta ese cmdlet. PowerShell busca módulos en cada ruta de acceso definida en la variable de $env:PSModulePath entorno. Las rutas de acceso se buscan en el orden en que aparecen en la variable . Dentro de cada ruta de acceso, los módulos se buscan en orden alfabético. PowerShell usa el cmdlet de la primera coincidencia que encuentra.

Evitar conflictos de nombres

La mejor manera de administrar conflictos de nombres de comando es evitarlos. Cuando asigne un nombre a los comandos, use un nombre único. Por ejemplo, agregue sus iniciales o acrónimos de nombre de empresa a los nombres de los comandos.

Al importar comandos en la sesión desde un módulo de PowerShell o desde otra sesión, puede usar el Prefix parámetro del cmdlet Import-Module o Import-PSSession para agregar un prefijo a los nombres de los comandos.

Por ejemplo, el siguiente comando evita cualquier conflicto con los Get-Date cmdlets y Set-Date que vienen con PowerShell al importar el DateFunctions módulo.

Import-Module -Name DateFunctions -Prefix ZZ

Ejecución de ejecutables externos

En Windows. PowerShell trata las extensiones de archivo enumeradas en la $env:PATHEXT variable de entorno como archivos ejecutables. Los archivos que no son ejecutables de Windows se entregan a Windows para procesar. Windows busca la asociación de archivos y ejecuta el verbo predeterminado de Windows Shell para la extensión. Para que Windows admita la ejecución por extensión de archivo, la asociación debe registrarse en el sistema.

Puede registrar el motor ejecutable para una extensión de archivo mediante los ftype comandos y assoc del shell de comandos de CMD. PowerShell no tiene ningún método directo para registrar el controlador de archivos. Para obtener más información, consulte la documentación del comando ftype .

Para que PowerShell vea una extensión de archivo como ejecutable en la sesión actual, debe agregar la extensión a la variable de $env:PATHEXT entorno.

Consulte también