about_Command_Precedence

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.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