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