Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 4, 2022 07:10 am GMT

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 variable CmdParams 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

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To