TEMA
about_Command_Precedence
DESCRIPCIÓN BREVE
Describe cómo determina Windows PowerShell qué comando se ejecutará.
DESCRIPCIÓN DETALLADA
En este tema se explica cómo determina Windows PowerShell qué
comando se va a ejecutar, sobre todo cuando una sesión contiene
más de un comando con el mismo nombre.
También se explica cómo ejecutar los comandos que no se ejecutan
de forma predeterminada y cómo evitar los conflictos de nombres
de comandos en una sesión.
PRECEDENCIA DE LOS COMANDOS
Cuando una sesión incluye comandos que tienen el mismo nombre,
Windows PowerShell utiliza las reglas siguientes para decidir qué
comando se ejecutará.
Estas reglas cobran mucha importancia si se agregan comandos a la
sesión desde módulos, complementos y otras sesiones.
-- Si se 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 que se encuentra en el directorio C:\TechDocs:
C:\TechDocs\FindDocs.ps1
Como característica de seguridad, Windows PowerShell no
ejecuta comandos ejecutables (nativos), ni siquiera scripts de
Windows PowerShell, a menos que el comando se encuentre en una
ruta de acceso incluida en la lista en de la variable de
entorno Path ($env:path) o que se especifique la ruta de
acceso al archivo de script.
Para ejecutar un script que se encuentra en el directorio
actual, se escribe la ruta de acceso completa o bien se usa un
punto (.) para representar el directorio actual.
Por ejemplo, para ejecutar el archivo FindDocs.ps1 en el
directorio actual, escriba:
.\FindDocs.ps1
-- Si no se especifica una ruta de acceso, Windows PowerShell
utiliza el orden de precedencia siguiente al ejecutar los comandos:
1. Alias
2. Function
3. Cmdlet
4. Comandos nativos de Windows
Por consiguiente, si escribe "help", Windows PowerShell busca en primer
lugar los alias que se denominan "help", a continuación, una función
denominada "Help" y, por último, un cmdlet denominado "Help".
Ejecuta el primer elemento "help" que encuentra.
Por ejemplo, supongamos que existe una función denominada Get-Map.
A continuación, se agrega o importa un cmdlet denominado Get-Map.
De forma predeterminada, Windows PowerShell ejecutará dicha función al
escribir "Get-Map".
-- Cuando la sesión contiene elementos del mismo tipo que tienen
el mismo nombre, como dos cmdlets con el mismo nombre, Windows
PowerShell ejecuta el elemento que se agregó a la sesión más
recientemente.
Por ejemplo, supongamos que tenemos un cmdlet denominado Get-Date.
A continuación, Windows PowerShell ejecutará el último cmdlet que se ha
importado, cuando se escribe "Get-Date".
ELEMENTOS OCULTOS Y REEMPLAZADOS
A causa de estas reglas, es posible que algunos elementos queden
ocultos o sean reemplazados por otros elementos con el mismo nombre.
-- Los elementos se "ocultan" o quedan "en la sombra" si
todavía puede tener acceso al elemento original, por
ejemplo, cualificando el nombre del elemento con el
nombre de un módulo o 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 módulo.
-- Los elementos se "reemplazan" o "sobrescriben" si ya no
puede tener 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 deja de estar accesible. Una variable
no se puede cualificar con el nombre de un módulo.
Además, si se escribe una función en la línea de comandos
y, a continuación, se importa una función con el mismo
nombre, se reemplaza la función original y deja de estar
accesible.
EJECUTAR COMANDOS OCULTOS
Es posible ejecutar comandos concretos especificando propiedades
de elemento que diferencian el comando de otros comandos que
podrían tener el mismo nombre.
Este método se puede utilizar para ejecutar cualquier comando,
pero resulta especialmente útil para ejecutar comandos ocultos.
Utilizar este método es un procedimiento recomendado cuando se
escribe script que se va a distribuir, puesto que no se puede
predecir qué comandos podrían estar presentes en la sesión donde
se ejecutará el script.
NOMBRES COMPLETOS
Es posible ejecutar comandos importados desde un complemento
o módulo de Windows PowerShell o de otra sesión, cualificando
el nombre del comando con el nombre del módulo o del
complemento donde se originó.
Los comandos se pueden cualificar, pero no las variables ni
los alias.
Por ejemplo, si un alias, una función o un cmdlet ocultan el
cmdlet Get-Date del complemento Microsoft.PowerShell.Utility
con el mismo nombre, se puede ejecutar mediante el nombre
completo del cmdlet que incluya el nombre del complemento:
Microsoft.PowerShell.Utility\Get-Date
Para ejecutar un comando New-Map agregado por el módulo
MapFunctions, se utiliza su nombre completo con el módulo:
MapFunctions\New-Map
Para buscar el complemento o el módulo desde el que se
importó un comando, se utiliza el formato del comando
Get-Command siguiente:
get-command <nombre-del-comando> | format-list -property
Name, PSSnapin, Module
Por ejemplo, para buscar el origen del cmdlet Get-Date, escriba:
get-command get-date | format-list -property Name,
PSSnapin, Module
Name : Get-Date
PSSnapIn : Microsoft.PowerShell.Utility
Module :
OPERADOR DE LLAMADA
También puede utilizar el operador de llamada (&) para
ejecutar cualquier comando que se pueda obtener mediante un
comando Get-ChildItem (el alias es "dir"), Get-Command o Get-Module.
Para ejecutar un comando, se incluye el comando Get-Command entre
paréntesis y se utiliza el operador de llamada (&) para ejecutar el
comando.
&(get-command ...)
- o bien,
&(dir ... )
Por ejemplo, si hay una función denominada Map que está
oculta por un alias denominado Map, se puede utilizar el
comando siguiente para ejecutar la función.
&(get-command -name map -type function)
- o bien,
&(dir function:\map)
También se puede guardar el comando oculto en una variable
para facilitar su ejecución.
Por ejemplo, el comando siguiente guarda la función Map en la
variable de $myMap y, a continuación, utiliza el operador de
llamada para ejecutarlo.
$myMap = (get-command -name map -type function)
&($myMap)
Si un comando se origina en un módulo, se puede utilizar el
formato siguiente para ejecutarlo:
& <objeto-PSModuleInfo> <comando>
Por ejemplo, para ejecutar el cmdlet Add-File en el módulo
FileCommands, utilice el script siguiente:
$FileCommands = get-module -name FileCommands
& $FileCommands Add-File
ELEMENTOS REEMPLAZADOS
Los elementos que no se han importado desde un módulo o
complemento, como las funciones, las variables y los alias que se
crean en la sesión, o que se agregan mediante un perfil, se
pueden reemplazar por los comandos que tienen el mismo nombre. Si
se reemplazan, no se puede tener acceso a ellos.
Las variables y los alias siempre se reemplazan, aunque se hayan
importado desde un módulo o complemento, porque no es posible
utilizar un operador de llamada ni un nombre completo para ejecutarlos.
Por ejemplo, si escribe una función Get-Map en la sesión y se
importa una función denominada Get-Map, la función original se
reemplaza y no se puede recuperar en la sesión actual.
EVITAR CONFLICTOS DE NOMBRES
La mejor manera de administrar los conflictos de nombres de
comandos es evitarlos. Al asignar nombres a los comandos, se
deben utilizar nombres que sean muy específicos o con una
probabilidad elevada de ser únicos. Por ejemplo, puede ser
conveniente agregar las iniciales del usuario o las siglas de la
empresa a los nombres que se utilicen en los comandos.
Además, al importar los comandos a la sesión desde un módulo de Windows
PowerShell o desde otra sesión, se utiliza el parámetro Prefix del cmdlet
Import-Module o Import-PSSession para agregar un prefijo a los sustantivos
de los nombres de comandos.
Por ejemplo, el comando siguiente evita cualquier conflicto con
los cmdlets Get-Date y Set-Date que se incluyen en Windows
PowerShell cuando se importa el módulo DateFunctions.
import-module -name DateFunctions -prefix ZZ
Para obtener más información, vea el tema de Ayuda correspondiente
a los cmdlets 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