An Interest In:
Web News this Week
- April 27, 2024
- April 26, 2024
- April 25, 2024
- April 24, 2024
- April 23, 2024
- April 22, 2024
- April 21, 2024
Una forma fcil de pasar parmetros en tus scripts de PowerShell
Mi apodo en las redes es Coding Bugs y llevo desde el ao 2004 trabajando como desarrollador y arquitecto de software. En mi dashboard encontrars artculos con informacin sobre lenguajes de programacin, tcnicas de programacin y otros conceptos que te ayudarn a mejorar.
Ya sabis que PowerShell es el lenguaje de programacin que Microsoft pone a nuestra disposicin para la "automatizacin de tareas multiplataforma compuesta por un shell de lnea de comandos, un lenguaje de scripting y un marco de gestin de la configuracin".
En este artculo mostrar una manera diferente de proporcionar valores a los parmetros de comandos y scripts. Esta es una forma sencilla y simple de declarar parmetros y asignar sus valores que os permitir organizar vuestros scripts de forma que todo tenga ms sentido.
Forma estndar
Si conoces PowerShell ya sabes como proporcionar parmetros en tus llamadas. Si no lo conoces, simplemente, indica el nombre del parmetro antecedido por un guion y, a continuacin, escribe su valor.
$ Get-ChildItem -Path C:\ -Filter *.txt # Devuelve todos los ficheros de texto existentes en C:\
Como puedes observar, la forma estndar es muy fcil y para casos en los que hagas invocaciones inmediatas es la mejor manera de proporcionar parmetros.
Sin embargo, imagina que tienes que contar el nmero de ficheros de un determinado tipo ubicados en una localizacin especfica de tu mquina. En este caso, tendramos que repetir tantas veces como fuera necesario la invocacin al comando anterior, Get-ChildItem
, proporcionando el parmetro Filter
en base al tipo de fichero solicitado.
$ Get-ChildItem -Path C:\ -Filter *.html | Measure | Select Count # Devuelve todos los ficheros HTML existentes en C:\$ Get-ChildItem -Path C:\ -Filter *.css | Measure | Select Count # Devuelve todos los ficheros CSS existentes en C:\$ Get-ChildItem -Path C:\ -Filter *.js | Measure | Select Count # Devuelve todos los ficheros JavaScript existentes en C:\
Para ahorrarnos tiempo cada vez que nos soliciten esa informacin vamos a generar un script propio en el que aadamos estas llamadas. Adems, vamos a incorporar un parmetro en el script para especificar la ubicacin concreta donde contar cada uno de los ficheros HTML, CSS y JS que hay.
param( [Parameter(Mandatory=$true)] [String] $Location)Return @{ Html = $(Get-ChildItem -Path $Location -Filter *.html | Measure).Count Css = $(Get-ChildItem -Path $Location -Filter *.css | Measure).Count Js = $(Get-ChildItem -Path $Location -Filter *.js | Measure).Count}
Qu sucede si ahora nos piden incluir ms y ms tipos de fichero con diferentes extensiones? La respuesta sera incluir ms y ms lneas a nuestro script para cumplir con lo que nos solicitan. Pero, y si hubiera otra forma ms sencilla y ms versatil dotando a nuestro script de la capacidad de abstraerse de los tipos de extensin?
Una hashtable
para pasar parmetros
Empezaremos por aadir un nuevo parmetro donde se indiquen las extensiones de los ficheros que tenemos que contar. Ahora slo tendremos que iterar sobre estos valores y pasar la extensin correspondiente al comando Get-ChildItem
.
param( [Parameter(Mandatory=$true)] [String] $Location, [Parameter(Mandatory=$true)] [String[]] $Extensions)Return $Extensions | Foreach { $CurrentExtension = $_.ToLower() # Transformar la extensin a minsculas Return @{ $_ = $(Get-ChildItem -Path $Location -Filter $CurrentExtension | Measure).Count } # Devuelve un objeto con la extensin como clave y el recuento obtenido como valor}
Con esto sera suficiente para nuestro objetivo pero, como programador que somos, queremos que sea an ms abstracto y nos permita mantener la llamada al comando Get-ChildItem
ms limpia, evitando tener que volver a modificarla con nuevos parmetros.
Al ser una lnea de comandos un poco compleja es mejor evitar su modificacin al mximo posible o hacerla ms simple divindola en trozos ms simples. Por el bien de este artculo, elegimos la primera opcin.
PowerShell permite el paso de un objeto hashtable
para proporcionar cada uno de los parmetros que necesitamos del comando a ejecutar. En nuestro caso, el comando es Get-ChildItem
y los parmetros que estamos utilizando son Path
y Filter
.
# La variable hashtable que crearemos ser como la siguiente$CmdParams = @{ Path = "." Filter = "*.*"}# Y la llamada al comando es como la siguiente, importante el uso de "@" en el paso de nuestro hashtableGet-ChildItem @CmdParams
Igual que en el caso anterior, tenemos que actualizar nuestra variable hashtable
con la extensin correspondiente en cada iteracin del Foreach
.
param( [Parameter(Mandatory=$true)] [String] $Location, [Parameter(Mandatory=$true)] [String[]] $Extensions)$CmdParams = @{ Path = $Location Filter = "*.*"}Return $Extensions | Foreach { $CurrentExtension = $_.ToLower() # Transformar la extensin a minsculas $CmdParams.Filter = "*.$CurrentExtension" # Establecer el filtro en la extensin actual Return @{ $_ = $(Get-ChildItem @CmdParams | Measure).Count } # Devuelve un objeto con la extensin como clave y el recuento obtenido como valor}
Ya hemos conseguido lo que buscabamos, hemos abstraido la llamada al comando Get-ChildItem
con respecto a los parmetros que necesitamos pasarle. De esta forma, podemos modificar la variable CmdParams
aadiendo, cambiando o quitando cualquier par clave-valor en base a las necesidades funcionales que tengamos.
Podemos ver aqu el segundo principio del paradigma SOLID, Open Closed Principle, en el que se indica que el cdigo debe ser cerrado a cualquier modificacin pero abierto para extender su funcionalidad. Podemos decir que el propsito de la iteracin sobre cada una de las extensiones es retornar el nmero de ficheros existentes en la ubicacin indicada. El comando
Get-ChildItem
puede ser invocado con otros parmetros que modificar el nmero de ficheros que retorne pero su resultado seguir siendo el mismo (cerrado a modificacin), por tanto, nuestra variableCmdParams
permite que los ficheros a devolver pueda ser diferente dependiendo de los parmetros que reciba (abierto a extensin).
Imagina que nos solicitan otra nueva funcionalidad. Ahora se necesita contabilizar los ficheros de la ubicacin proporcionada y los ficheros de las carpetas que se encuentran inmediatamente dentro, es decir, el primer nivel.
Djame explicarte que el comando Get-ChildItem
dispone de parmetros que nos permiten implementar este tipo de requisitos sin necesidad de hacer ningn tipo de ingeniera avanzada, usaremos los parmetros Recurse
para establecer que se realice la bsqueda en la localizacin indicada y en todas las que hay por debajo y, Depth
para establecer el mximo nmero de recursividad que necesatimos, en nuestro caso, el valor es de 1.
Seguro que ya has visualizado el cambio que hay que realizar al cdigo anterior. Desde mi punto de vista, algo muy sencillo que no nos llevar ms de 5 minutos entre el cambio y las pruebas para verificar que es correcto.
En nuestro cdigo tenemos que incluir los dos parmetros anteriores en la variable CmdParams
para que se aplique. Es un cambio limpio, slo aadir nuevos elementos en nuestro hashtable
sin tener que modificar la lnea de comandos donde se encuentra el comando que, como hemos dicho, es ciertamente compleja.
param( [Parameter(Mandatory=$true)] [String] $Location, [Parameter(Mandatory=$true)] [String[]] $Extensions)$CmdParams = @{ Path = $Location Filter = "*.*" Recurse = $true Depth = 1}Return $Extensions | Foreach { $CurrentExtension = $_.ToLower() # Transformar la extensin a minsculas $CmdParams.Filter = "*.$CurrentExtension" # Establecer el filtro en la extensin actual Return @{ $_ = $(Get-ChildItem @CmdParams | Measure).Count } # Devuelve un objeto con la extensin como clave y el recuento obtenido como valor}
Resumiendo
El paso de parmetros en comandos y/o scripts en PowerShelles sencillo. Podemos utilizar la forma estndar para llamadas a comandos o en scripts sencillos. Y, tambin, podemos usar tcnicas ms avanzadas que nos permitan tener un cdigo ms limpio e implementar modificaciones de forma ms sencilla.
El uso de hashtables
es una forma fcil de visualizar los valores de los parmetros de los comandos que invocamos. Adems, estructura nuestro cdigo haciendo que sea ms legible para los dems o, incluso, para nosotros mismos despues de pasado un tiempo.
El cdigo de este artculo lo tenis en este gist.
Feedback
Si te ha gustado este artculo no olvides clicar en el corazn o el unicornio y compartirlo con tus amigos y compaeros. Djame tus comentarios en la parte inferior sobre lo que te ha gustado o como mejorar y si quieres que escriba acerca de otros temas mndame un mensaje directo a mi cuenta de twitter.
Crditos
La imagen de cabecera procede de Unsplash y es cortesa de Markus Spiske
Original Link: https://dev.to/codbugs/una-forma-facil-de-pasar-parametros-en-tus-scripts-de-powershell-1pfi
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To