about_Command_Precedence
Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0
Insertar la introducción aquí.
TEMA
about_Command_Precedence
DESCRIPCIÓN BREVE
Describe cómo Windows PowerShell® determina qué comando se debe ejecutar.
DESCRIPCIÓN LARGA
En este tema se explica cómo Windows PowerShell determina el comando que se debe ejecutar, sobre todo cuando una sesión contiene más de un comando con el mismo nombre. También se explica cómo ejecutar comandos que no se ejecutan de forma predeterminada y cómo evitar conflictos de nombre de los comandos en la sesión.
PRIORIDAD DE LOS COMANDOS
Cuando una sesión incluye comandos que tienen el mismo nombre, Windows PowerShell usa las siguientes reglas para decidir qué comando se debe ejecutar.
Estas reglas son muy importantes si agrega comandos a la sesión desde módulos, complementos y otras sesiones.
-- Si especifica la ruta de acceso a un comando, Windows 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 directorio C:\TechDocs:
C:\TechDocs\FindDocs.ps1
Como característica de seguridad, Windows PowerShell no ejecuta comandos (nativos) ejecutables, como los scripts de Windows PowerShell, a menos que el comando se encuentre en una ruta de acceso que aparezca en la variable de entorno Path ($env:path) o a menos que especifique la ruta de acceso al archivo de script.
Para ejecutar un script que se encuentra en el directorio actual, especifique la ruta de acceso completa o escriba un punto (.) para representar el directorio actual.
Por ejemplo, para ejecutar el archivo FindDocs.ps1 en el directorio actual, escriba:
.\FindDocs.ps1
--Si no especifica ninguna ruta de acceso, Windows PowerShell usa el siguiente orden de prioridad al ejecutar comandos:
1. Alias
2. Function
3. Cmdlet
4. Native Windows commands
Por lo tanto, si escribe "ayuda", Windows PowerShell buscará primero un alias llamado "ayuda", luego buscará una función llamada "Ayuda" y, por último, buscará un cmdlet llamado "Ayuda". Ejecutará el primer elemento "ayuda" que encuentre.
Por ejemplo, si tiene una función Get-Map en la sesión e importa un cmdlet denominado Get-Map. De forma predeterminada, al escribir "Get-Map", Windows PowerShell ejecuta la función Get-Map.
-- Si la sesión contiene elementos del mismo tipo que tienen el mismo nombre (por ejemplo, dos cmdlets con el mismo nombre) Windows PowerShell ejecuta el último elemento agregado a la sesión.
Por ejemplo, si tiene un cmdlet denominado Get-Date e importa otro cmdlet denominado Get-Date, Windows PowerShell ejecutará de forma predeterminada el último cmdlet importado al escribir "Get-Date".
ELEMENTOS OCULTOS y REEMPLAZADOS
Como resultado de estas reglas, los elementos se pueden reemplazar u ocultar por elementos que tengan el mismo nombre.
-- Los elementos quedan "ocultos" o "sombreados" si puede seguir teniendo acceso al elemento original, como al calificar el nombre del elemento con un nombre de módulo o de complemento.
Por ejemplo, si importa una función que tiene el mismo nombre que un cmdlet de la sesión, el cmdlet se oculta (pero no se reemplaza) porque se ha importado desde un complemento o un módulo.
-- Los elementos se "reemplazan" o se "sobrescriben" si ya no tiene acceso al elemento original.
Por ejemplo, si importa una variable que tiene el mismo nombre que una variable de la sesión, se reemplaza la variable original y ya no se puede acceder a ella. No puede calificar una variable con un nombre de módulo.
Además, si escribe una función en la línea de comandos y después importa una función con el mismo nombre, se reemplaza la función original y ya no se puede acceder a ella.
BUSCAR COMANDOS OCULTOS
El parámetro All del cmdlet Get-Command obtiene todos los comandos que tengan el nombre especificado, aunque estén ocultos o se hayan reemplazado. A partir de Windows PowerShell 3.0, de forma predeterminada, Get-Command obtiene solo los comandos que se ejecutan cuando se escribe el nombre del comando.
En los siguientes ejemplos, la sesión incluye una función Get-Date y un cmdlet Get-Date.
El siguiente comando obtiene el comando Get-Date que se ejecuta al escribir "Get-Date".
PS C:\> Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function get-date
El siguiente comando usa el parámetro All para obtener todos los comandos Get-Date.
PS C:\> Get-Command Get-Date -All
CommandType Name ModuleName
----------- ---- ----------
Function get-date
Cmdlet Get-Date Microsoft.PowerShell.Utility
EJECUCIÓN DE COMANDOS OCULTOS
Puede ejecutar comandos concretos especificando propiedades de elementos que distingan el comando de otros comandos que puedan tener el mismo nombre.
Puede usar este método para ejecutar cualquier comando, pero sobre todo es útil para ejecutar comandos ocultos.
Use este método como práctica recomendada al escribir scripts que pretenda distribuir, dado que no puede predecir los comandos que podrían estar presentes en la sesión en la que se ejecuta el script.
NOMBRES COMPLETOS
Puede ejecutar comandos importados desde un complemento o módulo de Windows PowerShell o desde otra sesión; para ello debe calificar el nombre del comando con el nombre del módulo o del complemento en el que se originó.
Puede calificar comandos, pero no puede calificar variables ni alias.
Por ejemplo, si el cmdlet Get-Date del complemento Microsoft.PowerShell.Utility está oculto por un alias, una función o un cmdlet con el mismo nombre, puede ejecutarlo con el nombre completo del complemento del cmdlet:
Microsoft.PowerShell.Utility\Get-Date
Para ejecutar un comando New-Map agregado por el módulo MapFunctions, use el nombre completo del módulo:
MapFunctions\New-Map
Para buscar el complemento o el módulo del que se importó un comando, use la propiedad ModuleName del comando.
(Get-Command <command-name>).ModuleName
Por ejemplo, para buscar el origen del cmdlet Get-Date, escriba:
PS C:\>(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
OPERADOR DE LLAMADA
También puede usar el operador de llamada (&) para ejecutar cualquier comando que se pueda obtener usando un comando Get-ChildItem (el alias es "dir"), Get-Command o Get-Module.
Para ejecutar un comando, escriba el comando Get-Command entre paréntesis y use el operador de llamada (&) para ejecutarlo.
&(Get-Command ...)
- or -
&(dir ... )
Por ejemplo, si tiene una función llamada Map que está oculta por un alias llamado Map, use el siguiente comando para ejecutar la función.
&(Get-Command -Name Map -Type function)
- or -
&(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 función Map en la variable $myMap y, luego, usa el operador de llamada para ejecutarla.
$myMap = (Get-Command -Name map -Type function)
&($myMap)
Puede usar el siguiente formato para ejecutar un comando originado en un módulo.
& <PSModuleInfo-object> <command>
Por ejemplo, para ejecutar el cmdlet Add-File en el módulo FileCommands, use la siguiente secuencia de comandos.
$FileCommands = get-module -name FileCommands
& $FileCommands Add-File
ELEMENTOS REEMPLAZADOS
Los elementos que no se han importado desde un módulo o complemento (por ejemplo, las funciones, variables y alias que se crean en la sesión o que se agregan mediante un perfil) se pueden sustituir por comandos que tengan el mismo nombre. Si se sustituyen, no podrá tener acceso a ellos.
Las variables y los alias siempre se reemplazan, aunque se hayan importado desde un módulo o complemento, ya que no puede usar un operador de llamada o un nombre completo para ejecutarlos.
Por ejemplo, si escribe una función Get-Map en la sesión e importa una función denominada Get-Map, se reemplaza la función original. No puede recuperarla en la sesión actual.
EVITAR CONFLICTOS DE NOMBRE
La mejor manera de administrar los conflictos de nombre de comando es evitarlos. Al dar nombre a los comandos, use un nombre que sea muy específico o que probablemente sea único. Por ejemplo, agregue a los nombres de los comandos sus iniciales o el acrónimo del nombre de su compañía.
Además, al importar comandos en la sesión desde un módulo de Windows PowerShell o desde otra sesión, debe usar el parámetro Prefix 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 cmdlets Get-Date y Set-Date que se suministran con Windows PowerShell al importar el módulo DateFunctions.
Import-Module -Name DateFunctions -Prefix ZZ
Para obtener más información, consulte Import-Module e Import-PSSession.
VEA TAMBIÉN
about_Path_Syntax
about_Aliases
about_Functions
Alias (proveedor)
Función (proveedor)
Get-Command
Import-Module
Import-PSSession