Tratando de entender PowerShell: funciones, alias, etc.

4 minutos de lectura

Soy un programador de C# experimentado, pero hasta ahora, apenas he incursionado en PowerShell (habiendo usado otro producto de línea de comandos alternativo de Windows hasta ahora).

Estoy tratando de automatizar algunas cosas de Git, y me he encontrado con algunas dificultades y parece que no puedo encontrar ninguna solución a estas… (y ningún video tutorial o publicación de blog parece haber ayudado mucho hasta ahora, tampoco) .

Lo que estoy tratando de hacer es definir funciones y alias que hagan que mi trabajo con Git en PowerShell sea más cómodo, y sí, lo sé. Posh-Gity también lo he comprobado, pero parece que se trata principalmente de presentar una interfaz de usuario agradable en PowerShell.

Me gustaría definir “accesos directos” para el comando Git común que uso todo el tiempo, y he definido con éxito algunos alias hasta ahora.

Con lo que estoy luchando en este momento es esto: me gustaría tener un alias para git pull (y también git push), que puede ejecutarse “tal cual”, por ejemplo, ejecutarse git pullo que pueda ejecutar el comando más frecuente que necesito usar: git pull origin master.

traté de definir uno función:

function invoke-gitpull { git pull $args }

y luego defina dos alias para esto, uno simplemente llamando a esta función “tal cual”, otro proporcionando dos parámetros, como este:

Set-Alias gtp invoke-gitpull 
Set-Alias gtpom invoke-gitpull origin master

Pero de alguna manera, a PS no le gusta esto 🙁

Set-Alias: no se puede encontrar un parámetro posicional que acepte el argumento ‘origen’.
+ Set-Alias ​​gtpom invocar-gitpull origen maestro
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: Argumento no válido: (:) [Set-Alias]excepción de enlace de parámetro
+ Id. de error totalmente calificado: Parámetro posicional no encontrado, Microsoft.PowerShell.Commands.SetAliasCommand

Luego también traté de definir parámetros para el invoke-gitpull función – así:

function invoke-gitpull ([String] $remote, [String] $branch) { git pull $remote $branch }

pensando que si doy sin valores de parámetroentonces git pull se emitirá, y si proporciono dos valores de parámetros, invoke-gitpull -remote origin -branch masterentonces git pull origin master se llamaría, pero nuevamente, PS no está de acuerdo conmigo:

Set-Alias: no se puede encontrar un parámetro que coincida con el nombre de parámetro ‘remoto’.
+ Set-Alias ​​gtpom invocar-gitpull -origen remoto -maestro de rama
+ ~~~~~~~
+ CategoryInfo: Argumento no válido: (:) [Set-Alias]excepción de enlace de parámetro
+ Id. de error totalmente calificado: NamedParameterNotFound, Microsoft.PowerShell.Commands.SetAliasCommand

También probé con parámetros. en el interior la función:

pero volví a tener el mismo error.

Asi que CÓMO ¿Tengo que definir esos parámetros para mi invoke-gitpull función para que esto funcione? Parece que estoy dando vueltas, sin entender exactamente lo que estoy haciendo mal… ¿alguien puede iluminarme?

avatar de usuario
Maximiliano Burszley

Alias (utilizando el *-Alias cmdlets) se limitan a apuntar a nombres de comandos solamente, sin argumentos. Si desea tener argumentos para su alias como otro alias (como gtp origin master), es necesario definirlos como funciones:

function invoke-gitpull { git pull $args }
Set-Alias -Name gtp -Value invoke-gitpull
function gtpom { gtp origin master }

pero si esto es solo una cosa de uso privado, me saltearía los alias y los incluiría en su $Profile como los quieres:

function gtp() { & GIT.exe pull @args }
function gtpom() { gtp origin master }

  • Hice eso, y funciona bien, pero sigo recibiendo advertencias cuando ejecuto PS acerca de tener comandos que “no son fácilmente detectables” ya que no están usando la sintaxis estándar de verbo-sustantivo…

    – marc_s

    23 de septiembre de 2018 a las 16:42

  • @marc_s desafortunadamente, esa es una limitación de alias a menos que cree una combinación de función/alias para cada uno que desee. No estoy seguro de cómo suprimir la advertencia, pero investigaré un poco cuando tenga una PC disponible.

    – Maximiliano Burszley

    23 de septiembre de 2018 a las 17:17

  • @marc_s ¿Está definiendo estas funciones/alias en un módulo e importándolos a su perfil? Si es así, puede suprimir el flujo de advertencia redirigiéndolo: ipmo mymodule 3>$null

    – Maximiliano Burszley

    24/09/2018 a las 13:59

  • @marc_s Entonces sí, esa es una característica del Import-Module cmdlet. Tiene tres soluciones: suprimir las advertencias con 3>$null, -WarningAction Ignoreo defina una combinación de función (conforme a los verbos) / alias para cada alias que desee.

    – Maximiliano Burszley

    24/09/2018 a las 17:11


  • @marcs y TheIncorregible1: tenga en cuenta que es solo funciones [imported from modules] que están sujetos a la verificación de nombre – no hay restricciones en alias nombres También, Import-Module tiene un dedicado -DisableNameChecking cambiar para suprimir la advertencia; sin embargo, eso no te ayudará cuando importes módulos con using module .... Por el contrario, si un módulo es auto-cargado – en virtud de estar colocado en una carpeta listada en $env:PSModulePath – la advertencia es no mostrado.

    – mklement0

    24/09/2018 a las 17:58

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad