Share via


Windows PowerShell: Texto, XML y CSV — Oh mi

Windows PowerShell ofrece varias formas para trabajar con texto formateado, lo que resulta poderoso pero también conduce a la confusión.

Don Jones

Un aspecto en ocasiones confuso de Windows PowerShell es la variedad de formas en que maneja formatos de texto. Aquí está una prueba rápida: ¿Cuáles son las diferencias entre estos tres comandos?

Get-Service | Out-File services.txt Get-Service | Export-CSV services.csv Get-Service | Export-CliXML services.xml

Técnicamente, los tres de estos comandos producirá un archivo de texto. Puede abrir cualquiera de estos tres archivos de Bloc de notas de Windows y leer el contenido. Sin embargo, dos de esos archivos, utilizan texto para presentar datos en un formato delimitado. Hay una estructura adicional dentro del archivo que ayuda a separar la información que has creado.

Los siguientes tres comandos son legales y se ejecutarán sin error:

Get-Content services.txt Get-Content services.csv Get-Content services.xml

Sólo uno de esos comandos tiene sentido, sin embargo. La primera es sólo razonable. Sólo lee en un archivo de texto simple, no delimitadas. No es no formatear, porque si nos fijamos en el archivo claramente está formateado.

Aunque esté formateado en un sentido humano. El texto está en una bonita tabla columnar. Los datos se coloca de manera que tengan sentido para nuestros ojos y cerebros. No está organizado de una manera que permite identificar fácilmente los bits individuales de datos a un equipo.

Este es un concepto que preocupa a muchos recién llegados de Windows PowerShell. Hay una mnemónico simple que utilizo para ayudar con esto. Si ya lo tienes fuera del casco con un comando de exportación, que vuelva a la cáscara con un comando de importación. Si no usas la exportación, entonces no utilice importación. Importación y exportación son verbos vinculados. Siempre deben ir juntos. Así que si hiciste esto:

Get-Service | Export-CSV services.csv

Luego también haría esto:

Import-CSV services.csv

El comando de exportación CSV toma datos — en este caso los datos están información acerca de los servicios — y escribe los datos en un archivo. Bits individuales de los datos están delimitados por comas, porque eso es lo que usa el formato CSV. Esto significa que los nombres de servicio, Estados, etc. están separados por comas. Al leer los datos con la importación de CSV, Windows PowerShell analiza las comas, re-separates los datos y reconstruye los datos originales. Comparar los resultados con los resultados de este comando:

Get-Content services.csv

Este comando lee el texto, pero no hace nada con ella. La pantalla se llena con los valores separados por comas, pero Windows PowerShell realmente no separe los valores para usted. Sólo obtendrá el texto crudo, sin analizar, que es todo Get-Content nunca. Técnicamente, Get-Content produce un objeto String para cada línea del archivo de texto. Que es útil en ciertas situaciones, pero no es normalmente lo que tienes que hacer con un archivo CSV.

Toda esta situación es análoga a algo que probablemente has vivido así en Windows. ¿Abrir un archivo CSV en el Bloc de notas y lo que tienes? Ves un montón de texto. Eso es básicamente lo que está haciendo Get-Content. Ahora abra que mismo archivo CSV en Excel y ¿qué ves? Divide el archivo CSV, separar los datos en las columnas de la hoja de cálculo. Esto es muy similar a lo que está haciendo la importación de CSV.

¿Por qué es importante todo esto? Digamos que usted cree su propio archivo CSV. Seguir adelante y utilizar el Bloc de notas para crear un archivo que tiene un aspecto similar a este (pobres Greg Shields nunca hace bien en estos ejemplos):

Name,SamAccountName,Department,Title,City DonJ,DonJ,IT,CTO,Las Vegas GregS,GregS,Custodial,Janitor,Denver

Guardar el archivo como Users.csv del disco duro y vaya a un Windows PowerShell pronta. ¿Sin realmente ejecutarlos, puede usted adivinar lo que cada uno de estos dos comandos se hará?

Get-Content Users.csv | New-ADUser Import-CSV Users.csv | New-ADUser

Ambos asumen le ya ha ejecutado ActiveDirectory módulo de importación para cargar el módulo de Microsoft Active Directory, que viene con Windows Server 2008 R2 y está disponible en el paquete de herramientas de administración de servidor remoto de Windows 7.

El primer comando no funcionará. Eso es porque Get-Content no es analizar el archivo. Sólo está enviando un montón de cadenas raw a New-ADUser. Y nueva ADUser no podrá hacer nada útil con ellos.

El segundo comando funcionará, porque el casco analizar el archivo CSV, romper en trozos individuales de datos y enviar a ADUser de nuevo. Porque las piezas de datos: nombre, samAccountName, departamento, el título y la ciudad — son el mismo nombre como los parámetros correspondientes de New-ADUser, el cmdlet segundo creará dos nuevos usuarios disponer de la información del archivo CSV.

Esta es la diferencia entre trabajar con texto sin formato (es y Get-Content) y delimitado por datos (importación y exportación). Uso de archivos XML (CliXML de exportación e importación-CliXML) es incluso mejor, porque pueden representar más complejas estructuras de datos como datos jerárquicos. Archivos CSV están un formato plano que sólo puede representar un único nivel de datos.

Envolver la cabeza alrededor de estas diferencias es una de las cosas más importantes que puede hacer en la shell. Poder manipular los datos en la canalización es una de las cosas que hace tan poderoso Windows PowerShell. Dedicar algún tiempo a asegurarse de que entiende todas las diferencias, sutiles y no tan sutil.

Don_Jones

**Don Jones**es un ganador del premio MVP de Microsoft y autor de "Aprender Windows PowerShell en un mes de comidas" (Manning Publications, 2011), un libro diseñado para ayudar a cualquier administrador de convertirse en efectivo con Windows PowerShell. Jones también ofrece capacitación de Windows PowerShell in situ y público. Contactar con él a través de ConcentratedTech.com o bit.ly/AskDon.

Contenido relacionado