<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Coding Bugs</title>
    <description>The latest articles on DEV Community by Coding Bugs (@codbugs).</description>
    <link>https://dev.to/codbugs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F609947%2F4a77bb1c-0004-4a25-87ab-2984ff2ef11b.png</url>
      <title>DEV Community: Coding Bugs</title>
      <link>https://dev.to/codbugs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codbugs"/>
    <language>en</language>
    <item>
      <title>Quick Tip: Cómo unir ficheros CSV en 30 líneas de código</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Fri, 08 Apr 2022 09:57:41 +0000</pubDate>
      <link>https://dev.to/codbugs/quick-tip-como-unir-ficheros-csv-en-30-lineas-de-codigo-2b9a</link>
      <guid>https://dev.to/codbugs/quick-tip-como-unir-ficheros-csv-en-30-lineas-de-codigo-2b9a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mi apodo en las redes es &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt; y llevo desde el año 2004 trabajando como desarrollador y arquitecto de software. En mi &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt; encontrarás artículos con información sobre lenguajes de programación, técnicas de programación y otros conceptos que te ayudarán a mejorar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vuelvo con otro artículo de &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; en el que os muestro lo fácil y rápido en generar un único fichero CSV a partir de muchos. Os resultará útil desarrollando procesos cuyo resultado sea un informe en formato CSV y tengáis que unir los contenidos de varios fichero en uno sólo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;CSV es una sigla que denomina a los ficheros con valores separados por comas o, en inglés, _"Comma Separated Values"&lt;/em&gt;. Es un formato estandar de facto que se utiliza a menudo para el intercambio de información. El objetivo es tener un fichero de texto plano en el que cada fila es un registro, cada valor en la fila está separado por el carácter coma. Todas las filas tienen el mismo número de valores, es decir, el mismo número de comas. Visita la &lt;a href="https://www.rfc-editor.org/rfc/rfc4180"&gt;RFC 4180&lt;/a&gt; para información detallada._&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para que el código siguiente funcione sin errores, el requisito es que todos los ficheros CSV que queremos unir tengan la misma estructura, es decir, las mismas cabeceras y en el mismo orden.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si queréis trabajar con ficheros CSV y utilizáis Node.js, he desarrollado una librería que simplifica la obtención de sus datos mediante objetos, arrays y filtros dinámicos. Descárgatelo con NPM y obtén más información clicando en este &lt;a href="https://www.npmjs.com/package/csver"&gt;enlace&lt;/a&gt; y cuéntame cómo te ha ido.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Una vez hecha la introducción vamos a por el código para comentarlo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;If&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Writing headers obtained from the first file found&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Writing content for each file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script necesita 3 parámetros de entrada:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El primero indica el lugar donde se encuentran los ficheros CSV que queremos unir,&lt;/li&gt;
&lt;li&gt;El segundo permite indicar un filtro a aplicar para recoger los ficheros CSV objetivo,&lt;/li&gt;
&lt;li&gt;Por último, el tercer parámetro indica dónde y cuál será el fichero resultante de la unión.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hasta aquí muy sencillo. Los parámetros son todos de tipo &lt;code&gt;String&lt;/code&gt; simplificando aún más los valores de entrada.&lt;/p&gt;

&lt;p&gt;El siguiente bloque elimina el fichero resultante en caso de que exista. He añadido el parámetro &lt;code&gt;-Force&lt;/code&gt; para evitar que esté preguntando constantemente. Esto es una elección personal, si lo quieres cambiar, adelante.&lt;/p&gt;

&lt;p&gt;Ahora viene lo interesante, la unión de los contenidos. Para mantener la misma estructura existente en cada uno de los ficheros CSV tomo las cabeceras del primer fichero usnado mediante el comando &lt;code&gt;Get-ChildItem&lt;/code&gt; y seleccionando el primero de todos ellos con &lt;code&gt;Select -First 1&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obtener las cabeceras sigue el mismo patron con elementos diferentes. Leo el contenido del fichero, &lt;code&gt;Get-Content&lt;/code&gt;, selecciono la primera fila, &lt;code&gt;Select -First 1&lt;/code&gt; y lo escribo en el fichero de salida pasado en el tercer parámetro, &lt;code&gt;Out-File&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Como puedes apreciar, no estoy haciendo ningún tipo de tratamiento de los datos por ser CSV ni de otro tipo, es decir, usando el comando &lt;code&gt;Import-Csv&lt;/code&gt;. Como he comentado al principio del artículo, los ficheros CSV son ficheros de tipo texto y puede tratarse así al leerlo y al escribirlo.&lt;/p&gt;

&lt;p&gt;El último bloque de código itera sobre cada contenido de cada fichero para volcar todos los datos a excepción de la primera fila. Recordad que la primera fila serán las cabeceras y no necesitamos volver a escribirla.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como habéis visto, con 30 líneas de código, incluyendo espacios en blanco, indentaciones, etc., tenemos la unión de varios ficheros en uno sólo. Tal vez no tengáis la necesidad de hacer esto mismo pero espero que os sirva de inspiración.&lt;/p&gt;

&lt;p&gt;El código de este artículo lo tenéis en este &lt;a href="https://gist.github.com/codbugs/76ffe0b0fb8b2d4079e997df89f326b1"&gt;&lt;em&gt;gist&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha gustado este artículo no olvides clicar en el corazón o el unicornio y compartirlo con tus amigos y compañeros. Déjame tus comentarios en la parte inferior sobre lo que te ha gustado o como mejorar y si quieres que escriba acerca de otros temas mándame un mensaje directo a mi cuenta de &lt;a href="https://twitter.com/BugsCoding"&gt;twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Créditos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La imagen de cabecera procede de &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; y es cortesía de &lt;a href="https://unsplash.com/@mbaumi"&gt;Mika Baumeister&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Quick Tip - How to merge CSV files in 30 lines of code</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Fri, 08 Apr 2022 09:57:32 +0000</pubDate>
      <link>https://dev.to/codbugs/quick-tip-how-to-join-csv-files-in-30-lines-of-code-3koh</link>
      <guid>https://dev.to/codbugs/quick-tip-how-to-join-csv-files-in-30-lines-of-code-3koh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;My nickname in the networks is &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt;, and I have been working as a software architect and developer from 2004. In my &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt;, you will find articles about programming languages, programming techniques, and other concepts that will help you improve.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I am back with another &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; article in which I show you how easy and fast it is to generate a single CSV file from many. You will find it useful when developing processes that result in a report in CSV format and you have to merge the contents of several files into one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CSV is an acronym for Comma Separated Values (CSV) files. It is a de facto standard format that is often used for information exchange. The goal is to have a plain text file in which each row is a record, each value in the row is separated by the comma character. All rows have the same number of values, i.e. the same number of commas. See &lt;a href="https://www.rfc-editor.org/rfc/rfc4180"&gt;RFC 4180&lt;/a&gt; for detailed information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For the following code to work without errors, the requirement is that all the CSV files that we want to join have the same structure, i.e. the same headers and in the same order.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to work with CSV files and you use Node.js, I have developed a library that simplifies getting your data using objects, arrays and dynamic filters. Download with NPM and get more information clicking this &lt;a href="https://www.npmjs.com/package/csver"&gt;link&lt;/a&gt; and let me know your thoughts about it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the introduction is done, let's go to the code to comment it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;If&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Writing headers obtained from the first file found&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Writing content for each file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script needs 3 input parameters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The first one indicates the location where the CSV files we want to join are located,&lt;/li&gt;
&lt;li&gt;The second one allows to indicate a filter to apply to collect the targeted CSV files,&lt;/li&gt;
&lt;li&gt;Finally, the third parameter indicates where and what will be the file resulting from the join.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So far so simple. The parameters are all of type &lt;code&gt;String&lt;/code&gt; simplifying even more the input values.&lt;/p&gt;

&lt;p&gt;The next block deletes the resulting file if it exists. I have added the &lt;code&gt;-Force&lt;/code&gt; parameter to prevent it from constantly asking. This is a personal choice, if you want to change it, go ahead.&lt;/p&gt;

&lt;p&gt;Now comes the interesting part, the union of the contents. To maintain the same existing structure in each of the CSV files I take the headers of the first file used with the &lt;code&gt;Get-ChildItem&lt;/code&gt; command and selecting the first of them all with &lt;code&gt;Select -First 1&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Getting the headers follows the same pattern with different elements. I read the contents of the file, &lt;code&gt;Get-Content&lt;/code&gt;, select the first row, &lt;code&gt;Select -First 1&lt;/code&gt; and write it to the output file passed in the third parameter, &lt;code&gt;Out-File&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As you can see, I am not doing any kind of treatment of the data as CSV or otherwise, i.e. using the &lt;code&gt;Import-Csv&lt;/code&gt; command. As I mentioned at the beginning of the article, CSV files are text files and can be treated as such when reading and writing them.&lt;/p&gt;

&lt;p&gt;The last block of code iterates over the contents of each file to dump all the data except for the first row. Remember that the first row will be the headers and we do not need to rewrite it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NameFilter&lt;/span&gt;&lt;span class="s2"&gt;.csv"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OutputFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you have seen, with 30 lines of code, including whitespace, indentations, etc., we have the union of several files into one. Maybe you don't need to do this, but I hope it will inspire you.&lt;/p&gt;

&lt;p&gt;The code for this article can be found in this &lt;a href="https://gist.github.com/codbugs/76ffe0b0fb8b2d4079e997df89f326b1"&gt;&lt;em&gt;gist&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you liked this article, do not forget to click on the heart or the unicorn and share it with your friends and colleagues. Leave me your comments at the bottom about what you liked or how to improve and if you want me to write about other topics send me a direct message to my &lt;a href="https://twitter.com/BugsCoding"&gt;Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The header image comes from &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; and is courtesy of &lt;a href="https://unsplash.com/@mbaumi"&gt;Mika Baumeister&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>csv</category>
      <category>beginners</category>
    </item>
    <item>
      <title>An easy way to provide parameters in PowerShell</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Mon, 04 Apr 2022 07:10:13 +0000</pubDate>
      <link>https://dev.to/codbugs/an-easy-way-to-provide-parameters-in-powershell-7mh</link>
      <guid>https://dev.to/codbugs/an-easy-way-to-provide-parameters-in-powershell-7mh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;My nickname in the networks is &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt;, and I have been working as a software architect and developer from 2004. In my &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt;, you will find articles about programming languages, programming techniques, and other concepts that will help you improve.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You already know that &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; is the programming language that Microsoft makes available to us for &lt;em&gt;"a cross-platform task automation solution composed of a command-line shell, a scripting language and a configuration management framework"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In this article I will show you a different way to provide parameters to scripts and commands. This is a simple and easy way of declaring parameters and assigning their values that will allow you to organize your scripts so that everything makes more sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standard way&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you know &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; you already know how to provide parameters in your calls. If you don't, just type the name of the parameter preceded by a dash, then type its value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;txt&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Returns all existing text files in C:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the standard way is very easy and for cases where you make immediate invocations it is the best way to provide parameters.&lt;/p&gt;

&lt;p&gt;However, imagine that you have to count the number of files of a certain type located in a specific place on your machine. In this case, we would have to repeat as many times as necessary the invocation of the above command, &lt;code&gt;Get-ChildItem&lt;/code&gt;, providing the &lt;code&gt;Filter&lt;/code&gt; parameter based on the requested file type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Measure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Returns all existing HTML files in C:&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Measure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Returns all existing CSS files in C:&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Measure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Returns all existing JS files in C:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To save us time each time we are asked for this information we are going to generate our own script in which we add these calls. In addition, we are going to incorporate a parameter in the script to specify the location where to count each one of the HTML, CSS and JS files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*.&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens if we are now asked to include more and more file types with different extensions? The answer would be to include more and more lines to our script to fulfill the request. But what if there was another simpler and more versatile way, giving our script the ability to abstract from extension types?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A &lt;code&gt;hashtable&lt;/code&gt; for passing parameters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We will start by adding a new parameter indicating the extensions of the files we have to count. Now we will only have to iterate over these values and pass the corresponding extension to the &lt;code&gt;Get-ChildItem&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Transform extension to lower case&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Return an object with the extension as the key and the count obtained as the value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would be enough for our purpose but, as a &lt;em&gt;programmer&lt;/em&gt;, we want it to be even more abstract and allow us to keep the &lt;code&gt;Get-ChildItem&lt;/code&gt; command call cleaner, avoiding having to modify it again with new parameters. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Being a somewhat complex command line, it is better to avoid modifying it as much as possible or to make it simpler by breaking it into simpler pieces. For the sake of this article, we choose the first option.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.toPowerShell"&gt;PowerShell&lt;/a&gt; allows the passing of a &lt;code&gt;hashtable&lt;/code&gt; object to provide each of the parameters we need from the command to be executed. In our case, the command is &lt;code&gt;Get-ChildItem&lt;/code&gt; and the parameters we are using are &lt;code&gt;Path&lt;/code&gt; and &lt;code&gt;Filter&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The hashtable variable that we will create will look like the following one&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# And the command call is like the following, important the use of "@" character&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;CmdParams&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As in the previous case, we have to update our &lt;code&gt;hashtable&lt;/code&gt; variable with the corresponding extension in each iteration of the &lt;code&gt;Foreach&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Transform extension to lower case&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.&lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Set the filter to the current extension&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Return an object with the extension as the key and the count obtained as the value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have achieved what we were looking for, we have abstracted the call to the &lt;code&gt;Get-ChildItem&lt;/code&gt; command with respect to the parameters we need to pass to it. This way, we can modify the &lt;code&gt;CmdParams&lt;/code&gt; variable by adding, changing or removing any &lt;em&gt;key/value&lt;/em&gt; pair based on the functional needs we have.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We can see here the second principle of the SOLID paradigm, &lt;a href="https://dev.to/codbugs/learning-open-closed-principle-by-example-1628"&gt;&lt;strong&gt;Open-Closed Principle&lt;/strong&gt;&lt;/a&gt;, which states that the code should be closed to any modification but open to extend its functionality. We can say that the purpose of the iteration over each of the extensions is to return the number of existing files in the indicated location. The &lt;code&gt;Get-ChildItem&lt;/code&gt; command can be invoked with other parameters that will modify the number of files returned but its result will remain the same (closed to modification), therefore, our &lt;code&gt;CmdParams&lt;/code&gt; variable allows that the files to be returned can be different depending on the parameters received (open to extension).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine that we are asked for another new functionality. Now we need to count the files in the location provided and the files in the folders immediately inside, i.e. the first level.&lt;/p&gt;

&lt;p&gt;Let me explain that the &lt;code&gt;Get-ChildItem&lt;/code&gt; command has parameters that allow us to implement this type of requirements without the need to do any advanced engineering, we will use the &lt;code&gt;Recurse&lt;/code&gt; parameters to establish that the search is performed in the indicated location and in all the ones below and, &lt;code&gt;Depth&lt;/code&gt; to establish the maximum number of recursion that we need, in our case, the value is 1.&lt;/p&gt;

&lt;p&gt;Surely you have already visualized the change to be made to the previous code. From my point of view, something very simple that will not take us more than 5 minutes between the change and the tests to verify that it is correct.&lt;/p&gt;

&lt;p&gt;In our code we have to include the above two parameters in the &lt;code&gt;CmdParams&lt;/code&gt; variable for it to be applied. It is a clean change, just add new elements in our &lt;code&gt;hashtable&lt;/code&gt; without having to modify the command line where the command is located which, as we have said, is certainly complex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Depth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Transform extension to lower case&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.&lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Set the filter to the current extension&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Return an object with the extension as the key and the count obtained as the value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Summarizing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Passing parameters to &lt;a href="https://dev.toPowerShell"&gt;PowerShell&lt;/a&gt; commands and scripts is simple. We can use the standard way for command calls or simple scripts. And, also, we can use more advanced techniques that allow us to have a cleaner code and implement modifications in a simpler way.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;hashtables&lt;/code&gt; is an easy way to visualize the parameter values of the commands we invoke. In addition, it structures our code making it more readable for others or even for ourselves after a while.&lt;/p&gt;

&lt;p&gt;The code for this article can be found in this &lt;a href="https://gist.github.com/codbugs/d18b9b2d958c48d94f253535bb3896fe"&gt;&lt;em&gt;gist&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you liked this article, do not forget to click on the heart or the unicorn and share it with your friends and colleagues. Leave me your comments at the bottom about what you liked or how to improve and if you want me to write about other topics send me a direct message to my &lt;a href="https://twitter.com/BugsCoding"&gt;Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The header image comes from &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; and is courtesy of &lt;a href="https://unsplash.com/@markusspiske"&gt;Markus Spiske&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>programing</category>
      <category>script</category>
    </item>
    <item>
      <title>Una forma fácil de pasar parámetros en tus scripts de PowerShell</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Mon, 04 Apr 2022 07:10:05 +0000</pubDate>
      <link>https://dev.to/codbugs/una-forma-facil-de-pasar-parametros-en-tus-scripts-de-powershell-1pfi</link>
      <guid>https://dev.to/codbugs/una-forma-facil-de-pasar-parametros-en-tus-scripts-de-powershell-1pfi</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mi apodo en las redes es &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt; y llevo desde el año 2004 trabajando como desarrollador y arquitecto de software. En mi &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt; encontrarás artículos con información sobre lenguajes de programación, técnicas de programación y otros conceptos que te ayudarán a mejorar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ya sabéis que &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; es el lenguaje de programación que Microsoft pone a nuestra disposición para la &lt;em&gt;"automatización de tareas multiplataforma compuesta por un shell de línea de comandos, un lenguaje de scripting y un marco de gestión de la configuración"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;En este artículo mostraré una manera diferente de proporcionar valores a los parámetros de comandos y scripts. Esta es una forma sencilla y simple de declarar parámetros y asignar sus valores que os permitirá organizar vuestros scripts de forma que todo tenga más sentido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forma estándar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si conoces &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; ya sabes como proporcionar parámetros en tus llamadas. Si no lo conoces, simplemente, indica el nombre del parámetro antecedido por un guion y, a continuación, escribe su valor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;txt&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Devuelve todos los ficheros de texto existentes en C:\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como puedes observar, la forma estándar es muy fácil y para casos en los que hagas invocaciones inmediatas es la mejor manera de proporcionar parámetros.&lt;/p&gt;

&lt;p&gt;Sin embargo, imagina que tienes que contar el número de ficheros de un determinado tipo ubicados en una localización específica de tu máquina. En este caso, tendríamos que repetir tantas veces como fuera necesario la invocación al comando anterior, &lt;code&gt;Get-ChildItem&lt;/code&gt;, proporcionando el parámetro &lt;code&gt;Filter&lt;/code&gt; en base al tipo de fichero solicitado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Measure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Devuelve todos los ficheros HTML existentes en C:\&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Measure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Devuelve todos los ficheros CSS existentes en C:\&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Measure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="c"&gt;# Devuelve todos los ficheros JavaScript existentes en C:\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para ahorrarnos tiempo cada vez que nos soliciten esa información vamos a generar un script propio en el que añadamos estas llamadas. Además, vamos a incorporar un parámetro en el script para especificar la ubicación concreta donde contar cada uno de los ficheros HTML, CSS y JS que hay.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*.&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Qué sucede si ahora nos piden incluir más y más tipos de fichero con diferentes extensiones? La respuesta sería incluir más y más líneas a nuestro script para cumplir con lo que nos solicitan. Pero, ¿y si hubiera otra forma más sencilla y más versatil dotando a nuestro script de la capacidad de abstraerse de los tipos de extensión?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Una &lt;code&gt;hashtable&lt;/code&gt; para pasar parámetros&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Empezaremos por añadir un nuevo parámetro donde se indiquen las extensiones de los ficheros que tenemos que contar. Ahora sólo tendremos que iterar sobre estos valores y pasar la extensión correspondiente al comando &lt;code&gt;Get-ChildItem&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Transformar la extensión a minúsculas&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Devuelve un objeto con la extensión como clave y el recuento obtenido como valor&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto sería suficiente para nuestro objetivo pero, como &lt;em&gt;programador&lt;/em&gt; que somos, queremos que sea aún más abstracto y nos permita mantener la llamada al comando &lt;code&gt;Get-ChildItem&lt;/code&gt; más limpia, evitando tener que volver a modificarla con nuevos parámetros. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Al ser una línea de comandos un poco compleja es mejor evitar su modificación al máximo posible o hacerla más simple diviéndola en trozos más simples. Por el bien de este artículo, elegimos la primera opción.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.toPowerShell"&gt;PowerShell&lt;/a&gt; permite el paso de un objeto &lt;code&gt;hashtable&lt;/code&gt; para proporcionar cada uno de los parámetros que necesitamos del comando a ejecutar. En nuestro caso, el comando es &lt;code&gt;Get-ChildItem&lt;/code&gt; y los parámetros que estamos utilizando son &lt;code&gt;Path&lt;/code&gt; y &lt;code&gt;Filter&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# La variable hashtable que crearemos será como la siguiente&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Y la llamada al comando es como la siguiente, importante el uso de "@" en el paso de nuestro hashtable&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;CmdParams&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Igual que en el caso anterior, tenemos que actualizar nuestra variable &lt;code&gt;hashtable&lt;/code&gt; con la extensión correspondiente en cada iteración del &lt;code&gt;Foreach&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Transformar la extensión a minúsculas&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.&lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Establecer el filtro en la extensión actual&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Devuelve un objeto con la extensión como clave y el recuento obtenido como valor&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya hemos conseguido lo que buscabamos, hemos abstraido la llamada al comando &lt;code&gt;Get-ChildItem&lt;/code&gt; con respecto a los parámetros que necesitamos pasarle. De esta forma, podemos modificar la variable &lt;code&gt;CmdParams&lt;/code&gt; añadiendo, cambiando o quitando cualquier par &lt;em&gt;clave-valor&lt;/em&gt;  en base a las necesidades funcionales que tengamos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Podemos ver aquí el segundo principio del paradigma SOLID, &lt;a href="https://dev.to/codbugs/learning-open-closed-principle-by-example-1628"&gt;&lt;strong&gt;Open Closed Principle&lt;/strong&gt;&lt;/a&gt;, en el que se indica que el código debe ser cerrado a cualquier modificación pero abierto para extender su funcionalidad. Podemos decir que el propósito de la iteración sobre cada una de las extensiones es retornar el número de ficheros existentes en la ubicación indicada. El comando &lt;code&gt;Get-ChildItem&lt;/code&gt; puede ser invocado con otros parámetros que modificará el número de ficheros que retorne pero su resultado seguirá siendo el mismo (cerrado a modificación), por tanto, nuestra variable &lt;code&gt;CmdParams&lt;/code&gt; permite que los ficheros a devolver pueda ser diferente dependiendo de los parámetros que reciba (abierto a extensión).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagina que nos solicitan otra nueva funcionalidad. Ahora se necesita contabilizar los ficheros de la ubicación proporcionada y los ficheros de las carpetas que se encuentran inmediatamente dentro, es decir, el primer nivel.&lt;/p&gt;

&lt;p&gt;Déjame explicarte que el comando &lt;code&gt;Get-ChildItem&lt;/code&gt; dispone de parámetros que nos permiten implementar este tipo de requisitos sin necesidad de hacer ningún tipo de ingeniería avanzada, usaremos los parámetros &lt;code&gt;Recurse&lt;/code&gt; para establecer que se realice la búsqueda en la localización indicada y en todas las que hay por debajo y, &lt;code&gt;Depth&lt;/code&gt; para establecer el máximo número de recursividad que necesatimos, en nuestro caso, el valor es de 1.&lt;/p&gt;

&lt;p&gt;Seguro que ya has visualizado el cambio que hay que realizar al código anterior. Desde mi punto de vista, algo muy sencillo que no nos llevará más de 5 minutos entre el cambio y las pruebas para verificar que es correcto.&lt;/p&gt;

&lt;p&gt;En nuestro código tenemos que incluir los dos parámetros anteriores en la variable &lt;code&gt;CmdParams&lt;/code&gt; para que se aplique. Es un cambio limpio, sólo añadir nuevos elementos en nuestro &lt;code&gt;hashtable&lt;/code&gt; sin tener que modificar la línea de comandos donde se encuentra el comando que, como hemos dicho, es ciertamente compleja.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Location&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Depth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Extensions&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Transformar la extensión a minúsculas&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$CmdParams&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.&lt;/span&gt;&lt;span class="nv"&gt;$CurrentExtension&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Establecer el filtro en la extensión actual&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;CmdParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Measure&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="c"&gt;# Devuelve un objeto con la extensión como clave y el recuento obtenido como valor&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resumiendo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El paso de parámetros en comandos y/o scripts en &lt;a href="https://dev.toPowerShell"&gt;PowerShell&lt;/a&gt;es sencillo. Podemos utilizar la forma estándar para llamadas a comandos o en scripts sencillos. Y, también, podemos usar técnicas más avanzadas que nos permitan tener un código más limpio e implementar modificaciones de forma más sencilla.&lt;/p&gt;

&lt;p&gt;El uso de &lt;code&gt;hashtables&lt;/code&gt; es una forma fácil de visualizar los valores de los parámetros de los comandos que invocamos. Además, estructura nuestro código haciendo que sea más legible para los demás o, incluso, para nosotros mismos despues de pasado un tiempo.&lt;/p&gt;

&lt;p&gt;El código de este artículo lo tenéis en este &lt;a href="https://gist.github.com/codbugs/d18b9b2d958c48d94f253535bb3896fe"&gt;&lt;em&gt;gist&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha gustado este artículo no olvides clicar en el corazón o el unicornio y compartirlo con tus amigos y compañeros. Déjame tus comentarios en la parte inferior sobre lo que te ha gustado o como mejorar y si quieres que escriba acerca de otros temas mándame un mensaje directo a mi cuenta de &lt;a href="https://twitter.com/BugsCoding"&gt;twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Créditos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La imagen de cabecera procede de &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; y es cortesía de &lt;a href="https://unsplash.com/@markusspiske"&gt;Markus Spiske&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>script</category>
      <category>programming</category>
      <category>spanish</category>
    </item>
    <item>
      <title>¿Sabías que Microsoft Forms tiene la funcionalidad de borrador?</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Mon, 21 Mar 2022 09:48:43 +0000</pubDate>
      <link>https://dev.to/codbugs/sabias-que-microsoft-forms-tiene-la-funcionalidad-de-borrador-4d32</link>
      <guid>https://dev.to/codbugs/sabias-que-microsoft-forms-tiene-la-funcionalidad-de-borrador-4d32</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mi apodo en las redes es &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt; y llevo más de 15 años trabajando como desarrollador y arquitecto de software. En mi &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt; encontrarás artículos con información sobre lenguajes de programación, técnicas de programación y otros conceptos que te ayudarán a mejorar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para los que no conozcáis Microsoft Forms, decir que es una herramienta online para la creación de formularios y/o encuestas ubicada dentro de Office 365.&lt;/p&gt;

&lt;p&gt;Microsoft Forms tiene muchas y muy buenas funcionalidades pero, hay una que no está, y que los clientes suelen pedir, se trata de poder responder a las preguntas en diferentes momentos del día, es decir, poder tener un estado de borrador.&lt;/p&gt;

&lt;p&gt;En el caso de las encuestas con muchas preguntas, muchas secciones y ramas, los usuarios pueden encontrarse perdidos después de responder a varias de ellas. Es en este punto donde poder guardar la encuesta actual para terminarla en otro momento es muy útil.&lt;/p&gt;

&lt;p&gt;Sin embargo, he dicho que Microsoft Forms no tiene este tipo de funcionalidad o, tal vez, sí.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_V2S3n12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvp0ny1ltlqoi86g95e3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_V2S3n12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvp0ny1ltlqoi86g95e3.jpg" alt="Alt Text" width="868" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sí lo hace y tiene un mecanismo que la mayoría de los desarrolladores web conocen. El funcionamiento de Microsoft Forms es muy sencillo, si un usuario abre la encuesta, rellena varias respuestas y luego cierra el navegador web, es normal que haya perdido las respuestas dadas. Sin embargo, si vuelve a abrir el navegador web y va a la encuesta, verá las preguntas con las respuestas dadas.&lt;/p&gt;

&lt;p&gt;Podríamos pensar que Microsoft tiene un espacio en la nube donde almacena todas las respuestas de todos los usuarios que han dejado una media encuesta. No creo que sea el caso por las implicaciones en términos de dinero y energía a gastar.&lt;/p&gt;

&lt;p&gt;Pero, ¿hay alguna otra forma de conseguirlo? Sí, la hay y se trata de utilizar el localStorage del navegador en uso. Tan simple como eso, si hay información para la encuesta actual en su navegador, lo utilizará para establecer las respuestas que ha dado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hhYstZal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kzbzcv060melti28t1o7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hhYstZal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kzbzcv060melti28t1o7.png" alt="Alt Text" width="880" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que esta información te sea útil.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha gustado este artículo no olvides clicar en el corazón o el unicornio y compartirlo con tus amigos y compañeros. Déjame tus comentarios en la parte inferior sobre lo que te ha gustado o como mejorar y si quieres que escriba acerca de otros temas mándame un mensaje directo a mi cuenta de &lt;a href="https://twitter.com/BugsCoding"&gt;twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>office365</category>
      <category>forms</category>
      <category>features</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Improve how to provide parameters in your PowerShell scripts</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Sun, 13 Feb 2022 09:23:59 +0000</pubDate>
      <link>https://dev.to/codbugs/improve-how-to-provide-parameters-in-your-powershell-scripts-4256</link>
      <guid>https://dev.to/codbugs/improve-how-to-provide-parameters-in-your-powershell-scripts-4256</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;My nickname in the networks is &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt;, and I have been working as a software developer and architect for more than 15 years. In my &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt;, you will find articles about programming languages, programming techniques, and other concepts that will help you improve.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Microsoft describes &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; as &lt;em&gt;"a cross-platform task automation solution composed of a command-line shell, a scripting language and a configuration management framework"&lt;/em&gt;. In other words, it is a solution for creating scripts that perform repetitive tasks, for example, creating an account in the system when an employee joins the company, or deleting documents that are more than 5 years old in a folder.  Therefore, it is one more tool that we have at our disposal to automate recurring tasks.&lt;/p&gt;

&lt;p&gt;In this article I will show how to use general or global configurations for our scripts. From an &lt;strong&gt;ad hoc&lt;/strong&gt; configuration in which to set fixed values, to the &lt;strong&gt;reading of an external configuration file&lt;/strong&gt; with a specific format such as JSON, XML or CSV. The goal is to make the call to the &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; scripts as simple as possible and avoid any type of error. Ultimately, the person that will finally execute the processes will have no knowledge of the script's own code and, most likely, will not remember the value of the parameters to pass after a few weeks. The easier it is, the better for everyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ad hoc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Starting with an approach in which developing code based on parameters will allow us to have a set  of scripts that can be used in other implementations simply by indicating one value or another. An example of a generic script could be the downloading of information from the Internet. It will comprise 2 parameters: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the first one will be the URL address where to obtain the information and, &lt;/li&gt;
&lt;li&gt;the second one where we want to save it on disk.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Save data to the file path specified and returns the response&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OutFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FilePath&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# For downloading my Github profile to your machine use the following line&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# .\Download-Data.ps1 -Url https://github.com/codbugs -FilePath CodingBugs_Github_Profile.html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this way, we will be able to invoke this process as many times as we want and save the information of the URL addresses that we pass to it. The next logical step is to develop code specific to the needs or requirements we have. In this case, we will say that we want to save a version of a web page every day. Following the above example, we need to create a new script in which we always use the same URL and generate a folder based on the current day. The script will save the web page of &lt;a href="https://github.com/codbugs"&gt;my GitHub profile&lt;/a&gt; in a folder named equal to the current year, month and day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download-MyGithubProfile.ps1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# My GitHub profile page&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$MyGitHubProfileUrl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/codbugs"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Folder generation based on the current date&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yyyyMMdd"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# File name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FileName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CodingBugsProfile.html"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Invoking the script for downloading my GitHub profile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$MyGitHubProfileUrl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;$FileName&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore, the need has been covered by generating 2 scripts: the first one with a generic implementation and, the second one, with a specific implementation that does not require the operator to have knowledge of the parameters to be passed to the script.&lt;/p&gt;

&lt;p&gt;In what situations can we use a scripting model like this? I find it very useful when I have several different environments and I have to deploy the same elements in each of them. In this case, I create a generic deployment script with the parameters I need. Then, I create a new script for each environment with the environment-specific parameters. When I have to deploy in one environment or another I just run the corresponding script and I am sure that the parameter information is correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using configuration files is a simple way to abstract the code of those values necessary for its execution. Instead of passing all the parameters we can incorporate them in a text file and read them from the script itself.&lt;/p&gt;

&lt;p&gt;In this case, we will take advantage of the existing commands in &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; to use the file format we are most comfortable with: &lt;a href="https://json.org/json-es.html"&gt;JSON&lt;/a&gt;, CSV or XML. All of them have a quick way to read files and access their information.&lt;/p&gt;

&lt;p&gt;We start from the following file &lt;a href="https://json.org/json-es.html"&gt;JSON&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;coding_bugs_configuration.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Coding Bugs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding.bugs@outlook.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/codbugs"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"gists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"README.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/README.md"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding_bugs_configuration.csv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.csv"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding_bugs_configuration.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.json"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding_bugs_configuration.xml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.xml"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-CsvGistFiles.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-CsvGistFiles.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-Data.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-Data.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-JsonGistFiles.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-JsonGistFiles.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-MyGitHubProfile.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-MyGitHubProfile.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-XmlGistFiles.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-XmlGistFiles.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get the existing information in the configuration file we have to use the &lt;code&gt;ConvertFrom-Json&lt;/code&gt; command that transforms a &lt;a href="https://json.org/json-es.html"&gt;JSON&lt;/a&gt; code into a native PowerShell object. The goal is to use a simple and intuitive notation to read the data. In the following script, we use the existing information to download each of the &lt;em&gt;gist files&lt;/em&gt; in this article:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download-JsonGistFiles.ps1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Reading the configuration file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertFrom-Json&lt;/span&gt;&lt;span class="w"&gt; 

&lt;/span&gt;&lt;span class="c"&gt;# Creating the folder to download de gists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Downloading the gists files&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# .\Download-JsonGistFiles.ps1 -ConfigurationFilePath coding_bugs_configuration.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we want to have an XML file because it is easier for us, no problem. The resulting code is quite similar, we only have to modify how to read the configuration file and how to iterate through each of the &lt;em&gt;gist nodes&lt;/em&gt; elements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- coding_bugs_configuration.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;xml&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;author&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Coding Bugs&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;email&amp;gt;&lt;/span&gt;coding.bugs@outlook.com&lt;span class="nt"&gt;&amp;lt;/email&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;github&amp;gt;&lt;/span&gt;https://github.com/codbugs&lt;span class="nt"&gt;&amp;lt;/github&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/author&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;gists&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;README.md&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/README.md&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;coding_bugs_configuration.csv&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.csv&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;coding_bugs_configuration.json&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.json&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;coding_bugs_configuration.xml&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.xml&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-CsvGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-CsvGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-Data.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-Data.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-JsonGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-JsonGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-MyGitHubProfile.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-MyGitHubProfile.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-XmlGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-XmlGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/gists&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/xml&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Reading the configuration file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;XML&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Creating the folder to download de gists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Downloading the gists files&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# .\Download-XmlGistFiles.ps1 -ConfigurationFilePath coding_bugs_configuration.xml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, if we want to have a CSV file we have to modify how to read the configuration file and how to iterate through each of the rows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"version";"author_name";"author_email";"author_github";"gist_name";"gist_url"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"README.md";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/README.md"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"coding_bugs_configuration.csv";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.csv"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"coding_bugs_configuration.json";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.json"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"coding_bugs_configuration.xml";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.xml"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-CsvGistFiles.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-CsvGistFiles.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-Data.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-Data.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-JsonGistFiles.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-JsonGistFiles.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-MyGitHubProfile.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-MyGitHubProfile.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-XmlGistFiles.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-XmlGistFiles.ps1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; 

&lt;/span&gt;&lt;span class="c"&gt;# Reading the configuration file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Import-Csv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Delimiter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="c"&gt;# Creating the folder to download de gists&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author_name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="c"&gt;# Downloading the gists files&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gist_url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gist_name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# .\Download-CsvGistFiles.ps1 -ConfigurationFilePath coding_bugs_configuration.csv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Summarizing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When providing the values to the parameters of our PowerShell scripts, we can follow 2 strategies to facilitate the work of its execution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a generic script that can be used in any situation we need and a set of scripts with the parameters set directly in code and invoking the first one,&lt;/li&gt;
&lt;li&gt;Enter a configuration file with all the necessary parameters for the script.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You may be imagining a &lt;strong&gt;third possibility&lt;/strong&gt; . Indeed, it is the combination of the two previous ones, that is to say, to have a generic script with an implementation that covers the execution of the process itself by means of a configuration file, and a set of scripts specifying the concrete configuration file to use. In this way, we facilitate much more the actions to be taken in the execution or modification of our scripts.&lt;/p&gt;

&lt;p&gt;The code for this article can be found in this [&lt;em&gt;gist&lt;/em&gt;].(&lt;a href="https://gist.github.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0"&gt;https://gist.github.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you liked this article, do not forget to click on the heart or the unicorn and share it with your friends and colleagues. Leave me your comments at the bottom about what you liked or how to improve and if you want me to write about other topics send me a direct message to my &lt;a href="https://twitter.com/BugsCoding"&gt;Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The header image comes from &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; and is courtesy of &lt;a href="https://unsplash.com/@markusspiske"&gt;Markus Spiske&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>programming</category>
      <category>script</category>
    </item>
    <item>
      <title>Mejora el paso de parámetros en tus scripts de PowerShell</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Sun, 13 Feb 2022 09:23:48 +0000</pubDate>
      <link>https://dev.to/codbugs/mejora-el-paso-de-parametros-en-tus-scripts-de-powershell-573k</link>
      <guid>https://dev.to/codbugs/mejora-el-paso-de-parametros-en-tus-scripts-de-powershell-573k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mi apodo en las redes es &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt; y llevo más de 15 años trabajando como desarrollador y arquitecto de software. En mi &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt; encontrarás artículos con información sobre lenguajes de programación, técnicas de programación y otros conceptos que te ayudarán a mejorar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El propio Microsoft describe &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; como &lt;em&gt;"una solución de automatización de tareas multiplataforma compuesta por un shell de línea de comandos, un lenguaje de scripting y un marco de gestión de la configuración"&lt;/em&gt;. En otras palabras, es una solución para la creación de scripts que realicen tareas repetitivas, por ejemplo, la creación de una cuenta en el sistema cuando un empleado se incorpora en la compañía, o el borrado de documentos que tienen más de 5 años de antigüedad en una carpeta.  Por tanto, es una herramienta más que tenemos a nuestra disposición para automatizar tareas recurrentes.&lt;/p&gt;

&lt;p&gt;En este artículo mostraré como utilizar configuraciones de ámbito general o global para nuestros scripts. Desde una configuración &lt;strong&gt;ad hoc&lt;/strong&gt; en la que establecer de forma fija los valores, hasta la &lt;strong&gt;lectura de un fichero externo de configuración&lt;/strong&gt; con un formato específico como JSON, XML o CSV. El objetivo es hacer la llamada a los scripts de &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; lo más sencilla posible y evitar cualquier tipo de error. En definitiva, la persona o automatismo que finalmente ejecutará los procesos no tendrá conocimiento del código propio del script y, seguramente, tampoco recordará el valor de los parámetros a pasar después de unas semanas. Cuanto más fácil sea, mejor para todos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ad hoc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Comenzando con un enfoque en el que desarrollar código basado en parámetros, nos va a permitir tener una batería de scripts que podrán ser utilizados en otras implementaciones simplemente indicando un valor u otro. Un ejemplo de un script genérico puede ser  la descarga de información procedente de Internet. Este comprenderá 2 parámetros: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;el primero será la dirección URL donde obtener la información y, &lt;/li&gt;
&lt;li&gt;el segundo dónde queremos guardarla en disco.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Save data to the file path specified and returns the response&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OutFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FilePath&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# For downloading my Github profile to your machine use the following line&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# .\Download-Data.ps1 -Url https://github.com/codbugs -FilePath CodingBugs_Github_Profile.html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta forma, podremos invocar este proceso tantas veces como queramos y guardar la información de las direcciones URL que le pasemos. El siguiente paso lógico será desarrollar código específico para las necesidades o requisitos que tengamos. En este caso, diremos que queremos guardar una versión de una página web cada día. Siguiendo el ejemplo anterior, tenemos que crear un nuevo script en el que utilizar siempre la misma dirección URL y generar una carpeta en base al día actual. El script guardará la página web de &lt;a href="https://github.com/codbugs"&gt;mi perfil en GitHub&lt;/a&gt; en una carpeta con nombre igual al año, mes y día actual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download-MyGithubProfile.ps1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# My GitHub profile page&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$MyGitHubProfileUrl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/codbugs"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Folder generation based on the current date&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yyyyMMdd"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# File name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FileName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CodingBugsProfile.html"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Invoking the script for downloading my GitHub profile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$MyGitHubProfileUrl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;$FileName&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por lo tanto, la necesidad se ha cubierto generando 2 scripts: el primero con una implementación genérica con la posibilidad de ser utilizado en el caso que haya otro requisito parecido y, el segundo, con una implementación específica que no requiere que el operador tenga conocimiento de los parámetros que debe pasar al script.&lt;/p&gt;

&lt;p&gt;¿En qué situaciones podemos utilizar un modelo de scripts como este? A mí me resulta muy útil cuando tengo varios entornos diferentes y tengo que desplegar los mismos elementos en cada uno de ellos. En este caso, creo un script de despliegue genérico con los parámetros que necesito. Después, creo un nuevo script por cada entorno con los parámetros específicos de estos. Cuando tenga que desplegar en un entorno u otro sólo tengo que ejecutar el script correspondiente y estoy seguro que la información de los parámetros es la correcta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fichero de configuración&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usar ficheros de configuración es una forma sencilla de abstraer el código de aquellos valores necesarios para su ejecución. En vez de pasar todos los parámetros podemos incorporarlos en un fichero de texto y leerlos desde el propio script.&lt;/p&gt;

&lt;p&gt;En este caso, aprovecharemos los comandos existentes en &lt;a href="https://docs.microsoft.com/es-es/powershell/scripting/overview?view=powershell-7.2"&gt;PowerShell&lt;/a&gt; para utilizar el formato de fichero con el que nos sintamos más a gusto: &lt;a href="https://json.org/json-es.html"&gt;JSON&lt;/a&gt;, CSV o XML. Todos ellos tienen una forma rápida de leer ficheros y acceder a su información.&lt;/p&gt;

&lt;p&gt;Partimos del siguiente fichero &lt;a href="https://json.org/json-es.html"&gt;JSON&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;coding_bugs_configuration.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Coding Bugs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding.bugs@outlook.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/codbugs"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"gists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"README.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/README.md"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding_bugs_configuration.csv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.csv"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding_bugs_configuration.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.json"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding_bugs_configuration.xml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.xml"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-CsvGistFiles.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-CsvGistFiles.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-Data.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-Data.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-JsonGistFiles.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-JsonGistFiles.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-MyGitHubProfile.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-MyGitHubProfile.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Download-XmlGistFiles.ps1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-XmlGistFiles.ps1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para obtener la información existente en él tenemos que usar el comando &lt;code&gt;ConvertFrom-Json&lt;/code&gt; que transforma un código &lt;a href="https://json.org/json-es.html"&gt;JSON&lt;/a&gt; en un objeto nativo de PowerShell. El objetivo es utilizar una notación sencilla e intuitiva para leer los datos. En el siguiente script, utilizamos la información existente para descargarnos cada uno de los &lt;em&gt;gists&lt;/em&gt; de este artículo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download-JsonGistFiles.ps1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Reading the configuration file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertFrom-Json&lt;/span&gt;&lt;span class="w"&gt; 

&lt;/span&gt;&lt;span class="c"&gt;# Creating the folder to download de gists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Downloading the gists files&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# .\Download-JsonGistFiles.ps1 -ConfigurationFilePath coding_bugs_configuration.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si queremos tener un fichero XML porque nos resulta más sencillo, no hay problema. El código resultante es bastante similar, sólo tenemos que modificar cómo leer el fichero de configuración y cómo iterar por cada uno de los elementos &lt;em&gt;gists&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- coding_bugs_configuration.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;xml&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;author&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Coding Bugs&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;email&amp;gt;&lt;/span&gt;coding.bugs@outlook.com&lt;span class="nt"&gt;&amp;lt;/email&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;github&amp;gt;&lt;/span&gt;https://github.com/codbugs&lt;span class="nt"&gt;&amp;lt;/github&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/author&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;gists&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;README.md&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/README.md&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;coding_bugs_configuration.csv&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.csv&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;coding_bugs_configuration.json&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.json&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;coding_bugs_configuration.xml&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.xml&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-CsvGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-CsvGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-Data.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-Data.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-JsonGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-JsonGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-MyGitHubProfile.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-MyGitHubProfile.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;gist&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Download-XmlGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-XmlGistFiles.ps1&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/gist&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/gists&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/xml&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Reading the configuration file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;XML&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Creating the folder to download de gists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Downloading the gists files&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# .\Download-XmlGistFiles.ps1 -ConfigurationFilePath coding_bugs_configuration.xml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por último, si queremos tener un fichero CSV tenemos que modificar cómo leer el fichero de configuración y cómo iterar por cada una de las filas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"version";"author_name";"author_email";"author_github";"gist_name";"gist_url"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"README.md";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/README.md"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"coding_bugs_configuration.csv";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.csv"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"coding_bugs_configuration.json";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.json"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"coding_bugs_configuration.xml";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/coding_bugs_configuration.xml"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-CsvGistFiles.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-CsvGistFiles.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-Data.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-Data.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-JsonGistFiles.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-JsonGistFiles.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-MyGitHubProfile.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-MyGitHubProfile.ps1"
"1.0";"Coding Bugs";"coding.bugs@outlook.com";"https://github.com/codbugs";"Download-XmlGistFiles.ps1";"https://gist.githubusercontent.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0/raw/67b1a5e520d0ebaac8c678a43b9dda5638a147e1/Download-XmlGistFiles.ps1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; 

&lt;/span&gt;&lt;span class="c"&gt;# Reading the configuration file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Import-Csv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ConfigurationFilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Delimiter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Foreach&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="c"&gt;# Creating the folder to download de gists&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author_name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$Folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="c"&gt;# Downloading the gists files&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\Download-Data.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gist_url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FolderName&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gist_name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# .\Download-CsvGistFiles.ps1 -ConfigurationFilePath coding_bugs_configuration.csv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resumiendo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A la hora de proporcionar los valores a los parámetros de nuestros scripts en PowerShell, podemos seguir 2 estrategias que nos faciliten la labor de su ejecución:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generar un script genérico que nos sirva en cualquier situación que necesitemos y un conjunto de scripts con los parámetros establecidos directamente en código e invocando al primero,&lt;/li&gt;
&lt;li&gt;Introducir un fichero de configuración con todos los parámetros necesarios para el script.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Os estaréis imaginando en una &lt;strong&gt;tercera posibilidad&lt;/strong&gt; . Efectivamente, se trata de la combinación de las dos anteriores, es decir, tener un script genérico con una implementación que cubra la ejecución del propio proceso mediante un fichero de configuración, y un conjunto de scripts especificando el fichero de configuración concreto a utilizar. De esta forma, facilitamos mucho más las acciones que haya que tomar en la ejecución o modificación de nuestros scritps.&lt;/p&gt;

&lt;p&gt;El código de este artículo lo tenéis en este &lt;a href="https://gist.github.com/codbugs/3e3abe4c7709e992c819327cb0b9c0c0"&gt;&lt;em&gt;gist&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha gustado este artículo no olvides clicar en el corazón o el unicornio y compartirlo con tus amigos y compañeros. Déjame tus comentarios en la parte inferior sobre lo que te ha gustado o como mejorar y si quieres que escriba acerca de otros temas mándame un mensaje directo a mi cuenta de &lt;a href="https://twitter.com/BugsCoding"&gt;twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Créditos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La imagen de cabecera procede de &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; y es cortesía de &lt;a href="https://unsplash.com/@markusspiske"&gt;Markus Spiske&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>script</category>
      <category>programming</category>
      <category>spanish</category>
    </item>
    <item>
      <title>A privacy-based collaboration model with Office 365</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Wed, 26 Jan 2022 07:42:53 +0000</pubDate>
      <link>https://dev.to/codbugs/a-privacy-based-collaboration-model-with-office-365-22e4</link>
      <guid>https://dev.to/codbugs/a-privacy-based-collaboration-model-with-office-365-22e4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;My nickname in the networks is &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt;, and I have been working as a software developer and architect for more than 15 years. In my &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt;, you will find articles about programming languages, programming techniques, and other concepts that will help you improve.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Collaboration models allow people to perform different tasks to achieve a common goal. In the case of the tools available in &lt;a href="https://www.office.com/"&gt;&lt;em&gt;Office 365&lt;/em&gt;&lt;/a&gt;, digital collaboration models establish how employees and workers should perform their tasks to achieve a certain business goal: selling a certain number of units of a product, training a specific department in the use of a tool, executing the presentation of the company's results, etc.&lt;/p&gt;

&lt;p&gt;In this article I show a collaboration model based on the privacy of the content being worked on. From a private point of view, where a small and specific set of employees work together and the contents are not visible to the rest of the colleagues, to a way in which all workers can consume any kind of information and enrich it with more contents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8MbhgvLL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1588196749597-9ff075ee6b5b%3Fixlib%3Drb-1.2.1%26ixid%3DMnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8%26auto%3Dformat%26fit%3Dcrop%26w%3D1674%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8MbhgvLL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1588196749597-9ff075ee6b5b%3Fixlib%3Drb-1.2.1%26ixid%3DMnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8%26auto%3Dformat%26fit%3Dcrop%26w%3D1674%26q%3D80" alt="Virtual meeting by Chris Montgomery in Unsplash" width="880" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The sense of privacy is established on the basis of who can access information and documents and who cannot. For example, a company's financial results are worked on privately within the scope of, possibly, the finance department. The employees of this department are the only ones who can access the document and make changes. However, as soon as the head of the department determines that the document has been finalized, it is published to the company's employees. The privacy of the document has changed and its consumption is no longer as restrictive as it was previously. In the event that the document is exposed so that anyone can consult it, the privacy changes again and it has no privacy at all.&lt;/p&gt;

&lt;p&gt;With this definition of privacy we determine 4 areas of privacy in the world of work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Personal&lt;/em&gt;: the information to be managed belongs exclusively to the employee,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Team&lt;/em&gt;: the information to be managed belongs to the team members. Its consumption can only be done by the team members as well as the generation of new information or documentation. The rest of the company's employees will have no knowledge of the existence of the team or the information it handles,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Portal&lt;/em&gt;: the information to be handled belongs exclusively to the portal members. The consumption of the information is done by any employee of the company. However, the generation of new information is the responsibility of the portal members. Company employees will be able to search and consume existing information in any portal,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Company&lt;/em&gt;: the information to be managed belongs to all employees. The consumption of information and the generation of new information can be done by any employee.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Office 365 is the set of tools and cloud services that Microsoft makes available to companies to manage company tasks. Specifically, for document management and collaboration between employees we have &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt;, &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;&lt;em&gt;SharePoint Online&lt;/em&gt;&lt;/a&gt;, &lt;a href="https://www.microsoft.com/en-us/microsoft-365/yammer/yammer-overview"&gt;&lt;em&gt;Yammer&lt;/em&gt;&lt;/a&gt;, and &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;&lt;em&gt;OneDrive for Business&lt;/em&gt;&lt;/a&gt;. The features of each of these tools make them ideal for covering the above privacy areas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Personal&lt;/em&gt; security area&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As mentioned above, this area of security is the most restrictive of all. Following its definition, we must provide each employee with a secure space in which they can manage the documents they work on and to which only they have access.&lt;/p&gt;

&lt;p&gt;The most suitable tool is &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;&lt;em&gt;OneDrive for Business&lt;/em&gt;&lt;/a&gt;. Thanks to this, each employee has a private space in the cloud where to store and work with their own documentation. It can be considered as a local folder but with many more features to be discussed in another article.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Wdd6JEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/media/recipes/od4bcustomization/od4b-branded.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Wdd6JEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/media/recipes/od4bcustomization/od4b-branded.png" alt="Customized OneDrive for Business example" width="880" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Team&lt;/em&gt; security area&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This area would be the next one with a lower restriction than the previous one. In terms of its definition, we can consider it an extension of &lt;em&gt;Personal&lt;/em&gt; security area but for several employees, that is, to provide a secure space for a group of employees in which they can manage the documents they work on.&lt;/p&gt;

&lt;p&gt;The most suitable tool is &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt;. When creating a team in &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt;, a shared space is created for the team members in which only they themselves can work. It can be seen as a shared network folder specifically for a group of employees. However, this space has many more features to help team members communicate. An example of this is the ability to have a persistent chat.&lt;/p&gt;

&lt;p&gt;Some examples of spaces with &lt;em&gt;Team&lt;/em&gt; security scope are: project spaces, work groups, departmental spaces, training spaces, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Portal&lt;/em&gt; security area&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This area is an extension of the previous one because it allows exposing team information to the rest of the company's employees. In other words, we divide the workspace into two parts: a private part where team members can work securely without anyone outside the team being aware of the information contained; a public part where any employee can consume the information that the team wishes to publish.&lt;/p&gt;

&lt;p&gt;For this purpose, &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;&lt;em&gt;SharePoint Online&lt;/em&gt;&lt;/a&gt; is the most suitable tool. Due to its nature for document and web content management, it is ideal for publishing content and exposing it through existing web components configured on its pages. We consider these elements as the public part but, for the private part, we can also create and configure its elements so that team members are the only ones to access and collaborate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note that &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt; has a &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;&lt;em&gt;SharePoint Online&lt;/em&gt;&lt;/a&gt; site to manage its document content.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ofLjtve_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://support.content.office.net/es-es/media/e4202454-457d-4656-96c8-1e7887ee4567.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ofLjtve_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://support.content.office.net/es-es/media/e4202454-457d-4656-96c8-1e7887ee4567.png" alt="Microsoft Teams with several teams on the left and a channel conversation" width="520" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some examples of spaces with &lt;em&gt;Portal&lt;/em&gt; security scope are: departmental or area spaces, general training spaces, human resources spaces, business knowledge spaces, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Enterprise&lt;/em&gt; security area&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, this security scope is the least restrictive. Existing content is created by any employee of the organization and can be expanded with further information such as comments, discussions, questions, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/microsoft-365/yammer/yammer-overview"&gt;&lt;em&gt;Yammer&lt;/em&gt;&lt;/a&gt; is the tool whose features are appropriate to meet the above definition. In &lt;a href="https://www.microsoft.com/en-us/microsoft-365/yammer/yammer-overview"&gt;&lt;em&gt;Yammer&lt;/em&gt;&lt;/a&gt; you can create open communities where any employee can subscribe and receive notifications of new published content. Or, you can simply search for any relevant content and find related communities, conversations, discussions or questions. If you want to add more information or ask a specific question, you can do so without belonging to that particular community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FgW0bglJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4dZCC%3Fver%3De8fe%26q%3D90%26m%3D2%26h%3D768%26w%3D1024%26b%3D%2523FFFFFFFF%26aim%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FgW0bglJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4dZCC%3Fver%3De8fe%26q%3D90%26m%3D2%26h%3D768%26w%3D1024%26b%3D%2523FFFFFFFF%26aim%3Dtrue" alt="An example of Yammer community visualization" width="880" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some examples of spaces with &lt;em&gt;Enterprise&lt;/em&gt; security scope are: knowledge communities, training communities, FAQ communities, welcome communities, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To wrap up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The exercise carried out in this article establishes some rules for the use of &lt;a href="https://www.office.com/"&gt;&lt;em&gt;Office 365&lt;/em&gt;&lt;/a&gt; tools based on the privacy of the information and who manages it. We can make other classifications based on other premises and even suggest other tools for the security areas defined here. However, in my view, this is a good classification and a starting point for more complex models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you liked this article, do not forget to click on the heart or the unicorn and share it with your friends and colleagues. Leave me your comments at the bottom about what you liked or how to improve and if you want me to write about other topics send me a direct message to my &lt;a href="https://twitter.com/BugsCoding"&gt;Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The header image comes from &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; and is courtesy of &lt;a href="https://unsplash.com/@kaleidico"&gt;Kaleidico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>office365</category>
      <category>privacy</category>
      <category>sharepoint</category>
      <category>teams</category>
    </item>
    <item>
      <title>Un modelo de colaboración basado en la privacidad con Office 365</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Wed, 26 Jan 2022 07:42:45 +0000</pubDate>
      <link>https://dev.to/codbugs/un-modelo-de-colaboracion-basado-en-la-privacidad-con-office-365-1194</link>
      <guid>https://dev.to/codbugs/un-modelo-de-colaboracion-basado-en-la-privacidad-con-office-365-1194</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mi apodo en las redes es &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt; y llevo más de 15 años trabajando como desarrollador y arquitecto de software. En mi &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt; encontrarás artículos con nformación sobre lenguajes de programación, técnicas de programación y otros conceptos que te ayudarán a mejorar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Los modelos de colaboración permiten que las personas realicen tareas diferentes para conseguir un objetivo  común. En el caso de las herramientas disponibles en &lt;a href="https://www.office.com/"&gt;Office 365&lt;/a&gt;, los modelos de colaboración digitales establecen cómo los empleados y trabajadores deberán realizar sus tareas para un conseguir un determinado objetivo empresarial: conseguir vender un número determinado de unidades de un producto, la formación de un departamento concreto en el uso de una herramienta, la ejecución de la presentación de los resultados de la compañía, etc.&lt;/p&gt;

&lt;p&gt;En este artículo muestro un modelo de colaboración basado en la privacidad de los contenidos que se trabajan. Desde un punto de vista privado,  donde un conjunto pequeño y concreto de empleados trabajan de manera conjunta y los contenidos no son visible para el resto de compañeros, hasta una forma en la que todos los trabajadores pueden consumir cualquier tipo de información y enriquecerla con más contenidos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8MbhgvLL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1588196749597-9ff075ee6b5b%3Fixlib%3Drb-1.2.1%26ixid%3DMnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8%26auto%3Dformat%26fit%3Dcrop%26w%3D1674%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8MbhgvLL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1588196749597-9ff075ee6b5b%3Fixlib%3Drb-1.2.1%26ixid%3DMnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8%26auto%3Dformat%26fit%3Dcrop%26w%3D1674%26q%3D80" alt="Reunión virtual por Chris Montgomery en Unsplash" width="880" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El sentido de la privacidad se establece en base a quién puede acceder a la información y los documentos y quien no. Por ejemplo, los resultados económicos de una compañía se trabajan de manera privada dentro del ámbito, posiblemente, del departamento financiero. Los empleados de este departamento serán los únicos que podrán acceder al documento y realizar modificaciones. Sin embargo, en el momento que el responsable del departamento determina que ese documento está finalizado, se procede con su publicación a los empleados de la compañía. La privacidad del documento ha cambiado y su consumo deja de ser tan restrictivo como era anteriormente. En el caso que el documento se exponga para que cualquier persona pueda consultarlo, la privacidad vuelve a cambiar y pasa a no tener ningún tipo de privacidad.&lt;/p&gt;

&lt;p&gt;Con esta definición de privacidad determinamos 4 ámbitos de privacidad en el mundo laboral:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Personal&lt;/em&gt;: la información a gestionar pertenece, de forma exclusiva, al empleado,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Equipo&lt;/em&gt;: la información a manejar pertenece a los miembros del equipo. Su consumo sólo puede realizarse por los miembros del equipo al igual que la generación de nueva información o documentación. El resto de empleados de la empresa no tendrá conocimiento alguno sobre la existencia del equipo ni la información que maneja,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Portal&lt;/em&gt;: la información a manejar pertenece, de forma exclusiva, a los miembros del portal. El consumo de la información es realizado por cualquier empleado de la compañía. Sin embargo, la generación de nueva información es competencia de los miembros del portal. Los empleados de la compañía podrá buscar y consumir información existente en cualquier portal,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Empresa&lt;/em&gt;: la información a manejar pertenece a todos los empleados. El consumo de la información y la generación de nueva información puede ser realizada por cualquier empleado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Office 365 es el conjunto de herramientas y servicios en la nube que Microsoft pone a disposición de las empresas para gestionar las tareas de la compañía. En concreto, para la gestión documental y la colaboración entre empleados tenemos &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt;, &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;&lt;em&gt;SharePoint Online&lt;/em&gt;&lt;/a&gt;, &lt;a href="https://www.microsoft.com/en-us/microsoft-365/yammer/yammer-overview"&gt;&lt;em&gt;Yammer&lt;/em&gt;&lt;/a&gt;, y &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;&lt;em&gt;OneDrive for Business&lt;/em&gt;&lt;/a&gt;. Las características de cada una de estas herramientas las hacen ideales para cubrir los aspectos relativos a los ámbitos de privacidad anteriores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ámbito de seguridad &lt;em&gt;Personal&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tal y como hemos indicado anteriormente, este ámbito de seguridad es el más restrictivo de todos. Siguiendo su definición debemos dotar a cada uno de los empleados de un espacio seguro en el que poder gestionar los documentos en los que trabajan y que sólo tienen acceso ellos mismos.&lt;/p&gt;

&lt;p&gt;La herramienta más adecuada es &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;&lt;em&gt;OneDrive for Business&lt;/em&gt;&lt;/a&gt;. Gracias a esta, cada empleado dispone de un espacio privado en la nube donde almacenar y trabajar con documentación propia. Puede considerarse como una carpeta local aunque con muchas más funcionalidades para abordar en otro artículo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Wdd6JEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/media/recipes/od4bcustomization/od4b-branded.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Wdd6JEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/media/recipes/od4bcustomization/od4b-branded.png" alt="Ejemplo de OneDrive for Business con personalizaciones aplicadas" width="880" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ámbito de seguridad &lt;em&gt;Equipo&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este ámbito sería el siguiente con una restricción inferior al anterior. En cuanto a su definición, podemos considerar que es una ampliación del &lt;em&gt;Personal&lt;/em&gt; pero para varios empleados, es decir, dotar de un espacio seguro a un conjunto de empleados en el que poder gestionar los documentos en los que trabajan.&lt;/p&gt;

&lt;p&gt;La herramienta más adecuada es &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt;. En la creación de un equipo en &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt; se genera un espacio compartido por los miembros del equipo en el que sólo podrán trabajar ellos mismos. Puede considerarse como una carpeta de red compartida específicamente para un grupo de empleados. Sin embargo, este espacio tiene muchas más funcionalidades para ayudar a los miembros del equipo a comunicarse. Un ejemplo de ello es la  capacidad de tener un chat persistente en el que poder transmitir información entre los miembros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ofLjtve_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://support.content.office.net/es-es/media/e4202454-457d-4656-96c8-1e7887ee4567.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ofLjtve_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://support.content.office.net/es-es/media/e4202454-457d-4656-96c8-1e7887ee4567.png" alt="Microsoft Teams con la visión de varios equipos y la conversación del canal" width="520" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algunos ejemplos de espacios con ámbito de seguridad de &lt;em&gt;Equipo&lt;/em&gt; son: espacios para proyectos, grupos de trabajo, espacios departamentales, espacios para formación, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ámbito de seguridad &lt;em&gt;Portal&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este ámbito es una ampliación del anterior porque permite exponer información del equipo para el resto de empleados de la compañía. Es decir, dividimos el espacio de trabajo en dos partes: una privada en la que los miembros del equipo trabajarán de forma segura sin que nadie externo al equipo sea consciente de la información contenida; una parte pública donde cualquier empleado podrá consumir la información que el equipo desee publicar.&lt;/p&gt;

&lt;p&gt;Para este cometido, &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;&lt;em&gt;SharePoint Online&lt;/em&gt;&lt;/a&gt; es la herramienta más adecuada. Debido a su naturaleza para la gestión de contenidos documentales y contenidos web, es ideal para publicar contenidos y exponerlos mediante componentes web existentes configurados en sus páginas. Estos elementos los consideramos como la parte pública pero, para la parte privada, también podemos crear y configurar sus elementos para que los miembros del equipo sean los únicos en acceder y colaborar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Destacar que &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;&lt;em&gt;Microsoft Teams&lt;/em&gt;&lt;/a&gt; tiene un sitio de &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;&lt;em&gt;SharePoint Online&lt;/em&gt;&lt;/a&gt; para gestionar su contenido documental.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZriG-7nP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4oulx%3Fver%3D739b%26q%3D90%26m%3D2%26h%3D768%26w%3D1024%26b%3D%2523FFFFFFFF%26aim%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZriG-7nP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4oulx%3Fver%3D739b%26q%3D90%26m%3D2%26h%3D768%26w%3D1024%26b%3D%2523FFFFFFFF%26aim%3Dtrue" alt="Ejemplo de un sitio de comunicación de SharePoint Online" width="880" height="568"&gt;&lt;/a&gt;&lt;br&gt;
Algunos ejemplos de espacios con ámbito de seguridad de &lt;em&gt;Portal&lt;/em&gt; son: espacios departamentales o de áreas, espacios para formación general, espacios de recursos humanos, espacios de conocimiento empresarial, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ámbito de seguridad &lt;em&gt;Empresa&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Por último, este ámbito de seguridad es el menos restrictivo. Los contenidos existentes están creados por cualquier empleado de la organización y permite ser ampliado con mayor información como pueden ser comentarios, discusiones, preguntas, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/microsoft-365/yammer/yammer-overview"&gt;&lt;em&gt;Yammer&lt;/em&gt;&lt;/a&gt; es la herramienta cuyas características son las apropiadas para cumplir con la definición anterior. En &lt;a href="https://www.microsoft.com/en-us/microsoft-365/yammer/yammer-overview"&gt;&lt;em&gt;Yammer&lt;/em&gt;&lt;/a&gt; pueden crearse comunidades abiertas donde cualquier empleado podrá suscribirse y  recibir notificaciones de contenidos nuevos publicados. O, simplemente, puede buscar por cualquier contenido relevante y encontrar comunidades, conversaciones, discusiones o preguntas relacionadas. En el caso de querer añadir más información o preguntar por algo en concreto, podrá hacerlo sin necesidad de pertenecer a la comunidad en cuestión.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FgW0bglJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4dZCC%3Fver%3De8fe%26q%3D90%26m%3D2%26h%3D768%26w%3D1024%26b%3D%2523FFFFFFFF%26aim%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FgW0bglJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4dZCC%3Fver%3De8fe%26q%3D90%26m%3D2%26h%3D768%26w%3D1024%26b%3D%2523FFFFFFFF%26aim%3Dtrue" alt="Un ejemplo de visualización de comunidades de Yammer" width="880" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algunos ejemplos de espacios con ámbito de seguridad de &lt;em&gt;Empresa&lt;/em&gt; son: comunidades de conocimiento, comunidades de formación, comunidades de preguntas frecuentes, comunidades de bienvenida, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para finalizar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El ejercicio realizado en este artículo establece unas reglas de uso de las herramientas de &lt;a href="https://www.office.com/"&gt;&lt;em&gt;Office 365&lt;/em&gt;&lt;/a&gt; basadas en la privacidad de la información y quién la gestiona. Podemos realizar otro tipo de clasificaciones basadas en otras premisas e, incluso, sugerir otras herramientas para los ámbitos de seguridad aquí definidos. Sin embargo, bajo mi punto de vista, esta es una buena clasificación y un punto de partida para modelos más complejos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha gustado este artículo no olvides clicar en el corazón o el unicornio y compartirlo con tus amigos y compañeros. Déjame tus comentarios en la parte inferior sobre lo que te ha gustado o como mejorar y si quieres que escriba acerca de otros temas mándame un mensaje directo a mi cuenta de &lt;a href="https://twitter.com/BugsCoding"&gt;twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Créditos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La imagen de cabecera procede de &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; y es cortesía de &lt;a href="https://unsplash.com/@kaleidico"&gt;Kaleidico&lt;/a&gt;&lt;/p&gt;

</description>
      <category>office365</category>
      <category>privacy</category>
      <category>sharepoint</category>
      <category>teams</category>
    </item>
    <item>
      <title>You must attend the following online conferences this year 2022</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Thu, 20 Jan 2022 08:39:29 +0000</pubDate>
      <link>https://dev.to/codbugs/you-must-attend-the-following-online-conferences-this-year-2022-2ga2</link>
      <guid>https://dev.to/codbugs/you-must-attend-the-following-online-conferences-this-year-2022-2ga2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;My nickname in the networks is &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt;, and I have been working as a software developer and architect for more than 15 years. In my &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt;, you will find articles about programming languages, programming techniques, and other concepts that will help you improve.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Conferences allow people with common interests on a specific topic to exchange opinions, points of view, and debate on specific issues. They also serve to establish new friendships, build relationships with other people with the same interests and share experiences among peers.&lt;/p&gt;

&lt;p&gt;Nowadays, many conferences are held all over the world throughout the year. In the world of software development, there are conferences with specific topics: for each existing programming language (javascript, python, go, .net, etc.), generic aspects of software development (architectures and paradigms), also on the management of the developed source code itself (DevOps, Git, Mercurial, CI/CD, etc.), and even on tools, applications and services (Office 365, AWS, Google, etc.).&lt;/p&gt;

&lt;p&gt;In this article I offer you the conferences that I consider the most interesting for the topics and the depth with which they deal with them. I have divided them into two different lists based on my professional interests: the &lt;a href="https://www.office.com/"&gt;Office 365&lt;/a&gt; suite (&lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;SharePoint Online&lt;/a&gt;, &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;OneDrive for Business&lt;/a&gt;, &lt;a href="https://powerplatform.microsoft.com/en-us/"&gt;Power Platform&lt;/a&gt;, &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;Microsoft Teams&lt;/a&gt;, etc.) and my personal interests: the world of web application development with JavaScript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The conferences and their information about the sessions, topics and dates indicated have been obtained directly from the links indicated in each one of them and at the date of publication of this article. All these data are subject to change as the days progress during the year.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Office 365 Conferences&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For those of you who do not know, &lt;a href="https://www.office.com/"&gt;Office 365&lt;/a&gt; is a set of products, applications and services that Microsoft makes available to companies for the management and development of their employees' day-to-day tasks. Among them we have &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;SharePoint Online&lt;/a&gt;, &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;OneDrive for Business&lt;/a&gt;, &lt;a href="https://powerplatform.microsoft.com/en-us/"&gt;Power Platform&lt;/a&gt;, &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;Microsoft Teams&lt;/a&gt;, etc., and &lt;a href="https://www.microsoft.com/es-es/microsoft-viva"&gt;Viva&lt;/a&gt; as the latest addition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://myignite.microsoft.com/home"&gt;&lt;em&gt;&lt;strong&gt;Microsoft Ignite&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft is the organizer of one of the most important conferences of the year, the &lt;a href="https://myignite.microsoft.com/home"&gt;&lt;em&gt;"Microsoft Ignite"&lt;/em&gt;&lt;/a&gt;, in which Microsoft professionals along with others with a very close relationship expose new features of products and tools and others that will come in the near future or are included in the roadmap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0jDKy7IG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1gew6o3qn6vx9kp3s42ge0y1-wpengine.netdna-ssl.com/wp-content/uploads/prod/2020/09/MS_Ignite_web_1920x1080-logo-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0jDKy7IG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1gew6o3qn6vx9kp3s42ge0y1-wpengine.netdna-ssl.com/wp-content/uploads/prod/2020/09/MS_Ignite_web_1920x1080-logo-1.png" alt="Microsoft Ignite Logo" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last two years they have held the conference remotely and everyone, from anywhere on the planet, could attend with their web browser without any problem. In addition, all sessions are recorded and are available to the general public on the event's own website, &lt;a href="https://myignite.microsoft.com/home"&gt;&lt;em&gt;"Microsoft Ignite"&lt;/em&gt;&lt;/a&gt; and on the official Microsoft documentation website, &lt;a href="https://docs.microsoft.com/"&gt;https://docs.microsoft.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;They have not yet released the date for this year's event but it will be around the first week of November. Check their website regularly for the timing of the release date.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sharepointeurope.com/"&gt;&lt;em&gt;&lt;strong&gt;European SharePoint Office 365 &amp;amp; Azure Conference&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another of the most important conferences on &lt;a href="https://www.office.com/"&gt;Office 365&lt;/a&gt; is the &lt;a href="https://www.sharepointeurope.com/"&gt;&lt;em&gt;"European SharePoint Office 365 &amp;amp; Azure Conference"&lt;/em&gt;&lt;/a&gt; in which professionals from around the world show experiences, best practices and other techniques to get the most out of the products offered by Microsoft.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jfR2vM_L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.sharepointeurope.com/wp-content/uploads/slider4/espc22_copenhagen_logo_colourreverse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jfR2vM_L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.sharepointeurope.com/wp-content/uploads/slider4/espc22_copenhagen_logo_colourreverse.png" alt="European SharePoint Office 365 &amp;amp; Azure Conference flyer" width="880" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last two years it has been done remotely, but this year, they are also face-to-face. In addition, the sessions have been divided into 3 categories to guide the attendees in the contents they want to attend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Learn @ESCP22&lt;/em&gt; aims to showcase the latest practices, tips and techniques thanks to the best professionals on the planet,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Connect @ESCP22&lt;/em&gt; aims to reconnect attendees through various events and activities. There is also an area where companies will exhibit their products and services,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Be Inspired @ESCP22&lt;/em&gt; aims to inspire attendees through talks from industry leaders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This year it will be held in Copenhagen (Denmark) from November 28 to December 1.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sharepointeurope.com/european-power-platform-conference/"&gt;&lt;em&gt;&lt;strong&gt;European Power Platform Conference&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, this year for the first time there will be a conference on &lt;a href="https://powerplatform.microsoft.com/en-us/"&gt;Power Platform&lt;/a&gt; called &lt;a href="https://www.sharepointeurope.com/european-power-platform-conference/"&gt;&lt;em&gt;"European Power Platform Conference"&lt;/em&gt;&lt;/a&gt;. The organizers are the same as the &lt;a href="https://www.sharepointeurope.com/"&gt;&lt;em&gt;"European SharePoint Conference"&lt;/em&gt;&lt;/a&gt; and with the same categorization in the existing sessions: Learn, Connect and Be Inspired. This conference will be face-to-face only, a real shame for those of us who will not be attending.&lt;/p&gt;

&lt;p&gt;This year it will be held in Berlin (Germany) from April 6 to 8.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript Conferences&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The JavaScript programming language is, according to the &lt;a href="https://insights.stackoverflow.com/survey/2021#technology-most-popular-technologies"&gt;"Developers Survey 2021"&lt;/a&gt;, the language most used by developers at the moment, together with other web technologies (HTML and CSS). It is continuously evolving and incorporating new functionalities year after year.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jamstack.org/community/"&gt;&lt;em&gt;&lt;strong&gt;Jamstack Conf&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jamstack.org/"&gt;Jamstack&lt;/a&gt; is a web space where the benefits of the application architecture with the same name based on the development of web applications hosted in CDN with calls to different API services to work the information of the application itself are shown. Experts from different parts of the world have contributed and continue to contribute to the development of this architecture with best practices, use cases, scenarios where it can be useful, and other things.&lt;/p&gt;

&lt;p&gt;Last year there was only one conference, however, in previous years they held several at different times of the year and this year they already have 2 planned: the first one at the end of January, and the second one at the end of February. Stay tuned to their website for more events as the year progresses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kA69PZr2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://secure.meetupstatic.com/photos/event/a/1/4/clean_501362580.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kA69PZr2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://secure.meetupstatic.com/photos/event/a/1/4/clean_501362580.jpeg" alt="Jamstack Florence conference flyer" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cfe.dev/events/the-jam-2022/"&gt;&lt;em&gt;&lt;strong&gt;TheJam.dev&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cfe.dev/events/the-jam-2022/"&gt;&lt;em&gt;"TheJam.dev"&lt;/em&gt;&lt;/a&gt; collects expert sessions on &lt;a href="https://jamstack.org/"&gt;Jamstack&lt;/a&gt; and makes them available to the general public. As we said in the previous talk, &lt;a href="https://jamstack.org/"&gt;Jamstack&lt;/a&gt; is a web-based architecture that focuses on the web application itself and relies on API services to work with the information.&lt;/p&gt;

&lt;p&gt;This year the conference is free of charge and takes place over 2 days, January 26 and 27.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6CPUwKPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d33wubrfki0l68.cloudfront.net/ff21ff9132a0f506f3513896a7e6488eeaa337cf/c5259/img/banners/jamdev-012622.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6CPUwKPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d33wubrfki0l68.cloudfront.net/ff21ff9132a0f506f3513896a7e6488eeaa337cf/c5259/img/banners/jamdev-012622.png" alt="TheJam.dev conference flyer" width="819" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Other conferences&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are many other conferences dedicated to &lt;em&gt;JavaScript&lt;/em&gt; but I wanted to highlight these two because of the content they offer and because they are free. The rest of the conferences offer very interesting sessions but they return to the face-to-face model and, consequently, you have to pay to attend or under a mixed model in which they offer a series of sessions and contents online and free and the rest of the sessions under a payment model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summarizing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Conferences and sessions are a way to meet people with similar tastes and experiences to yours. It also allows you to expand your network and learn new things that you may not have known before or, on the contrary, to realize the knowledge you treasure and share it in future sessions.&lt;/p&gt;

&lt;p&gt;In this article I have listed those conferences and events that I consider most appropriate to follow, firstly, the &lt;a href="https://www.office.com/"&gt;&lt;em&gt;Office 365&lt;/em&gt;&lt;/a&gt; world and, secondly, to be updated about best practices, architectures, and techniques about &lt;em&gt;JavaScript&lt;/em&gt; within web application development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you liked this article, do not forget to click on the heart or the unicorn and share it with your friends and colleagues. Leave me your comments at the bottom about what you liked or how to improve and if you want me to write about other topics send me a direct message to my &lt;a href="https://twitter.com/BugsCoding"&gt;Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The header image comes from &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; and is courtesy of &lt;a href="https://unsplash.com/@samuelpereira"&gt;Samuel Pereira&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>office365</category>
      <category>conference</category>
    </item>
    <item>
      <title>Debes asistir a las siguientes conferencias online de este año 2022</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Thu, 20 Jan 2022 08:39:21 +0000</pubDate>
      <link>https://dev.to/codbugs/debes-asistir-a-las-siguientes-conferencias-online-de-este-ano-2022-5bgh</link>
      <guid>https://dev.to/codbugs/debes-asistir-a-las-siguientes-conferencias-online-de-este-ano-2022-5bgh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mi apodo en las redes es &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt; y llevo más de 15 años trabajando como desarrollador y arquitecto de software. En mi &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt; encontrarás artículos con información sobre lenguajes de programación, técnicas de programación y otros conceptos que te ayudarán a mejorar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Las conferencias permiten que la gente con intereses comunes sobre alguna temática específica puedan intercambiar opiniones, puntos de vista, y realizar debates sobre aspectos específicos. También sirven para entablar nuevas amistades, relaciones con otras personas con los mismos intereses y compartir experiencias entre iguales.&lt;/p&gt;

&lt;p&gt;En la actualidad, se realizan muchas conferencias a lo largo y ancho del planeta durante todo el año. En el mundo del desarrollo del software existen conferencias con temáticas específicas: por cada lenguaje de programación existente (javascript, python, go, .net, etc.), aspectos genéricos del desarrollo del software (arquitecturas y paradigmas), también sobre la propia gestión del código fuente desarrollado (DevOps, Git, Mercurial, CI/CD, etc.), e, incluso, sobre herramientas, aplicaciones y servicios (Office 365, AWS, Google, etc.).&lt;/p&gt;

&lt;p&gt;En este artículo os ofrezco las conferencias, que considero, más interesantes por las temáticas y la profundidad con la que las tratan. Las he dividido en dos listados diferentes basados en mis intereses profesionales: la suite de &lt;a href="https://www.office.com/"&gt;Office 365&lt;/a&gt; (&lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;SharePoint Online&lt;/a&gt;, &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;OneDrive for Business&lt;/a&gt;, &lt;a href="https://powerplatform.microsoft.com/en-us/"&gt;Power Platform&lt;/a&gt;, &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;Microsoft Teams&lt;/a&gt;, etc.) y en mis intereses personales: el mundo del desarrollo de aplicaciones web con JavaScript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Las conferencias y su información acerca de las sesiones, temáticas y fechas indicadas ha sido obtenida directamente de los enlaces indicados en cada una de ellas y a la fecha de la publicación de este artículo. Todos estos datos son susceptibles de cambiar a medida que avancen los días durante el año.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Conferencias de Office 365&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para aquellos que no lo sepáis, &lt;a href="https://www.office.com/"&gt;Office 365&lt;/a&gt; es un conjunto de productos, aplicaciones y servicios que Microsoft pone a disposición de las empresas para la gestión y desarrollo de las tareas propias del día a día de los empleados. Entre ellas tenemos &lt;a href="https://www.microsoft.com/es-es/microsoft-365/sharepoint/collaboration"&gt;SharePoint Online&lt;/a&gt;, &lt;a href="https://www.microsoft.com/en-us/microsoft-365/onedrive/onedrive-for-business"&gt;OneDrive for Business&lt;/a&gt;, &lt;a href="https://powerplatform.microsoft.com/en-us/"&gt;Power Platform&lt;/a&gt;, &lt;a href="https://www.microsoft.com/es-es/microsoft-teams/group-chat-software"&gt;Microsoft Teams&lt;/a&gt;, etc., y &lt;a href="https://www.microsoft.com/es-es/microsoft-viva"&gt;Viva&lt;/a&gt; como la última incorporación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://myignite.microsoft.com/home"&gt;&lt;em&gt;&lt;strong&gt;Microsoft Ignite&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft es el organizador de una de las conferencias más importantes del año, el &lt;a href="https://myignite.microsoft.com/home"&gt;&lt;em&gt;"Microsoft Ignite"&lt;/em&gt;&lt;/a&gt;, en la que profesionales de Microsoft junto a otros con una relación muy cercana exponen nuevas funcionalidades de los productos y herramientas y otras que vendrán en el futuro más cercano o están incluidas en el roadmap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0jDKy7IG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1gew6o3qn6vx9kp3s42ge0y1-wpengine.netdna-ssl.com/wp-content/uploads/prod/2020/09/MS_Ignite_web_1920x1080-logo-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0jDKy7IG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1gew6o3qn6vx9kp3s42ge0y1-wpengine.netdna-ssl.com/wp-content/uploads/prod/2020/09/MS_Ignite_web_1920x1080-logo-1.png" alt="Microsoft Ignite Logo" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los dos últimos años han realizado la conferencia de manera remota y a la que todo el mundo, desde cualquier lugar del planeta, podía asistir con su explorador web sin problema. Además, todas las sesiones son grabadas y están disponibles para el público general en la propia página del evento, &lt;a href="https://myignite.microsoft.com/home"&gt;&lt;em&gt;"Microsoft Ignite"&lt;/em&gt;&lt;/a&gt; y en la página web con la documentación oficial de Microsoft, &lt;a href="https://docs.microsoft.com/"&gt;https://docs.microsoft.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Todavía no han publicado la fecha para el evento de este año pero será alrededor de la primera semana de Noviembre. Visita regularmente su página web para ver el momento de la fecha de su publicación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sharepointeurope.com/"&gt;&lt;em&gt;&lt;strong&gt;European SharePoint Office 365 &amp;amp; Azure Conference&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Otra de las conferencias más importantes sobre &lt;a href="https://www.office.com/"&gt;Office 365&lt;/a&gt; es la &lt;a href="https://www.sharepointeurope.com/"&gt;&lt;em&gt;"European SharePoint Office 365 &amp;amp; Azure Conference"&lt;/em&gt;&lt;/a&gt; en la que profesionales de todo el mundo muestran experiencias, buenas prácticas y otras técnicas para sacar el máximo rendimiento a los productos que ofrece Microsoft.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jfR2vM_L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.sharepointeurope.com/wp-content/uploads/slider4/espc22_copenhagen_logo_colourreverse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jfR2vM_L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.sharepointeurope.com/wp-content/uploads/slider4/espc22_copenhagen_logo_colourreverse.png" alt="European SharePoint Office 365 &amp;amp; Azure Conference flyer" width="880" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los dos últimos años se ha realizado de forma remota, pero, este año, también son presenciales. Además, las sesiones se han dividido en 3 categorías para guiar a los asistentes en los contenidos a los que quieren asistir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Learn @ESCP22&lt;/em&gt; tiene el objetivo de mostrar las últimas prácticas, consejos y técnicas gracias a los mejores profesionales existentes en el planeta,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Connect @ESCP22&lt;/em&gt; tiene el objetivo de volver a conectar a los asistentes a través de varios eventos y actividades. También, existe un área donde las compañías expondrán sus productos y servicios,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Be Inspired @ESCP22&lt;/em&gt; tiene el objetivo de inspirar a los asistentes mediante charlas procedentes de los líderes de la industria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este año se celebrará en Copenague (Dinamarca) desde el 28 de Noviembre al 1 de Diciembre.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sharepointeurope.com/european-power-platform-conference/"&gt;&lt;em&gt;&lt;strong&gt;European Power Platform Conference&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por último, este año se celebrará por primera vez la conferencia sobre &lt;a href="https://powerplatform.microsoft.com/en-us/"&gt;Power Platform&lt;/a&gt; llamada &lt;a href="https://www.sharepointeurope.com/european-power-platform-conference/"&gt;&lt;em&gt;"European Power Platform Conference"&lt;/em&gt;&lt;/a&gt;. Los organizadores son los mismos que la &lt;a href="https://www.sharepointeurope.com/"&gt;&lt;em&gt;"European SharePoint Conference"&lt;/em&gt;&lt;/a&gt; y con la misma categorización en las sesiones existentes: Learn, Connect y Be Inspired. Esta conferencia será sólo presencial, una auténtica pena para los que no asistiremos.&lt;/p&gt;

&lt;p&gt;Este año se celebrará en Berlín (Alemania) desde el 6 al 8 de Abril.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Las conferencias de JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El lenguaje de programación de JavaScript es, según la &lt;a href="https://insights.stackoverflow.com/survey/2021#technology-most-popular-technologies"&gt;"Developers Survey 2021"&lt;/a&gt;, el lenguaje más usado por los desarrolladores, en estos momentos, junto al resto de tecnologías web (HTML y CSS). Está en continua evolución e incorporando nuevas funcionalidades año tras año.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jamstack.org/community/"&gt;&lt;em&gt;&lt;strong&gt;Jamstack Conf&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jamstack.org/"&gt;Jamstack&lt;/a&gt; es un espacio en la web donde se muestran los beneficios de la arquitectura de aplicaciones con el mismo nombre basada en el desarrollo de aplicaciones web alojadas en CDN con llamadas a diferentes servicios API para trabajar la información de la propia aplicación. Expertos de diferentes partes del mundo han contribuido y continúan contribuyendo en el desarrollo de esta arquitectura con buenas prácticas, casos de uso, escenarios donde puede ser útil, y otro tipo de cosas.&lt;/p&gt;

&lt;p&gt;El año pasado hubo una única conferencia, sin embargo, en anteriores años hicieron varias en diferentes momentos del año y este año tienen ya planificadas 2: la primera a finales de Enero, y la segunda a finales de Febrero. Sigue atento a su página para ver más eventos a medida que avanza el año.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kA69PZr2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://secure.meetupstatic.com/photos/event/a/1/4/clean_501362580.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kA69PZr2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://secure.meetupstatic.com/photos/event/a/1/4/clean_501362580.jpeg" alt="Jamstack Florence conference flyer" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cfe.dev/events/the-jam-2022/"&gt;&lt;em&gt;&lt;strong&gt;TheJam.dev&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cfe.dev/events/the-jam-2022/"&gt;&lt;em&gt;"TheJam.dev"&lt;/em&gt;&lt;/a&gt; recoge sesiones de expertos en &lt;a href="https://jamstack.org/"&gt;Jamstack&lt;/a&gt; y las pone a disposición del público en general. Como hemos dicho en la anterior conferencia, &lt;a href="https://jamstack.org/"&gt;Jamstack&lt;/a&gt; es una arquitectura basada en web que se centra en la propia aplicación web y se apoya en servicios API para trabajar con la información.&lt;/p&gt;

&lt;p&gt;Este año la conferencia es gratuita y se realiza durante 2 días, 26 y 27 de Enero.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6CPUwKPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d33wubrfki0l68.cloudfront.net/ff21ff9132a0f506f3513896a7e6488eeaa337cf/c5259/img/banners/jamdev-012622.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6CPUwKPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d33wubrfki0l68.cloudfront.net/ff21ff9132a0f506f3513896a7e6488eeaa337cf/c5259/img/banners/jamdev-012622.png" alt="TheJam.dev conference flyer" width="819" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Otras conferencias&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hay otras muchas más conferencias dedicadas a &lt;em&gt;JavaScript&lt;/em&gt; pero he querido resaltar estas dos por los contenidos que ofrecen y porque son gratuitas. El resto de conferencias ofrecen sesiones muy interesantes pero vuelven al modelo presencial y, en consecuencia, hay que pagar para acudir o bajo un modelo mixto en el que ofrecen una serie de sesiones y contenidos de manera online y gratuita y el resto de sesiones bajo modelo de pago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumiendo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Las conferencias y sesiones son una forma de conocer gente con gustos y experiencias similares a las tuyas. Además, te permite ampliar tu red de contactos y aprender cosas nuevas que, quizás, no conocieras o, al contrario, te des cuenta del conocimiento que atesoras y puedas compartirlo en próximas sesiones.&lt;/p&gt;

&lt;p&gt;En este artículo he listado aquellas conferencias y eventos que considero más apropiadas para seguir, en primer lugar, el mundo &lt;a href="https://www.office.com/"&gt;&lt;em&gt;Office 365&lt;/em&gt;&lt;/a&gt; y, en segundo lugar, para estar al día acerca de buenas prácticas, arquitecturas, y técnicas acerca de &lt;em&gt;JavaScript&lt;/em&gt; dentro del desarrollo de aplicaciones web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si te ha gustado este artículo no olvides clicar en el corazón o el unicornio y compartirlo con tus amigos y compañeros. Déjame tus comentarios en la parte inferior sobre lo que te ha gustado o como mejorar y si quieres que escriba acerca de otros temas mándame un mensaje directo a mi cuenta de &lt;a href="https://twitter.com/BugsCoding"&gt;twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Créditos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La imagen de cabecera procede de &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; y es cortesía de &lt;a href="https://unsplash.com/@samuelpereira"&gt;Samuel Pereira&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>office365</category>
      <category>conferences</category>
    </item>
    <item>
      <title>Find out what a "Timestamp" is for</title>
      <dc:creator>Coding Bugs</dc:creator>
      <pubDate>Mon, 10 Jan 2022 09:20:03 +0000</pubDate>
      <link>https://dev.to/codbugs/find-out-what-a-timestamp-is-for-dk7</link>
      <guid>https://dev.to/codbugs/find-out-what-a-timestamp-is-for-dk7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;My nickname in the networks is &lt;a href="https://dev.to/codbugs"&gt;&lt;strong&gt;Coding Bugs&lt;/strong&gt;&lt;/a&gt;, and I have been working as a software developer and architect for more than 15 years. In my &lt;a href="https://dev.to/codbugs"&gt;dashboard&lt;/a&gt;, you will find articles about programming languages, programming techniques, and other concepts that will help you improve.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;em&gt;"timestamp"&lt;/em&gt; is a way of setting the current date and time to a set of values. The simplest example corresponds to each record in a database saving the date when of creation. So, checking when they have been added, ordering them by the creation time, or grouping them by months, weeks, or days can help their tracking.&lt;/p&gt;

&lt;p&gt;The timestamp is a way of registering additional temporary information to any element we are handling. For example, photography cameras allow you to add the date and time when you press the shutter button and take the photo, Post offices also mark letters and packages upon receipt and delivery.&lt;/p&gt;

&lt;p&gt;In our digital world, many and varied activities include timestamping. When you create a file on your computer, the operating system adds the created date and time as a property of your file. And, in addition, if you or a computer process modify the file content, you can check the latest modification date value of the file in a different property. Both values ​​are timestamps because they record two events related to the document, its creation, and the latest modification.&lt;/p&gt;

&lt;p&gt;The value of the timestamp must be &lt;strong&gt;consistent&lt;/strong&gt; in its format because of comparisons between its values. In some cases, the date will be the only thing worth saving while, in more specific scenarios, we might need the date and time and, even, milliseconds. But this depends on the design of our application and the stated requirements.&lt;/p&gt;

&lt;p&gt;Timestamps are used in log systems to save helpful information to trace applications, data, or processes. Databases also use them to set the creation or modification of a record, and even the date on which it is no longer helpful or logically deleted. Source code management systems like Git also used timestamps: each &lt;em&gt;"commit"&lt;/em&gt; records its date and time. Finally, &lt;em&gt;"blockchain"&lt;/em&gt; technology is used to establish the generation moment of each block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incorporate a timestamp into your application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now let's go with an example and apply timestamps in an imaginary application. Imagine that we need to record the date and time when we receive a request to any method of our API. The data that we will have to save will be the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;log_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// API method URL&lt;/span&gt;
    &lt;span class="na"&gt;verb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', ...]&lt;/span&gt;
    &lt;span class="na"&gt;created&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// timestamp&lt;/span&gt;
    &lt;span class="c1"&gt;// more helpful information&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the following code, we create an object to store several values helpful to track the API methods invocations. The &lt;em&gt;"created"&lt;/em&gt; property keeps the date and time, and its value is the current date after creating the object. We can follow the timeline and see the methods that have been invoked over time dumping this information to a human-readable format in a local file.&lt;/p&gt;

&lt;p&gt;For more information about the format of timestamps in the digital world, I recommend reading how to represent dates and times set in &lt;a href="https://www.iso.org/iso-8601-date-and-time-format.html"&gt;ISO 8601&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summarizing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Timestamps allow you to set a date and time based on the events of data: creation, modification, deletion, etc. They are a simple way to follow up on the data and to be able to analyze their history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you liked this article, do not forget to click on the heart or the unicorn and share it with your friends and colleagues. Leave me your comments at the bottom about what you liked or how to improve and if you want me to write about other topics send me a direct message to my &lt;a href="https://twitter.com/BugsCoding"&gt;Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The header image comes from &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; and is courtesy of  &lt;a href="https://unsplash.com/@jcosens"&gt;Jonathan Cosens Photography&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
