Windows PowerShell. Testo, XML e CSV — Oh mio

Windows PowerShell offre diversi metodi di gestione della formattazione dei testi, un processo efficace, ma spesso confusionario.

Don Jones

Un aspetto talvolta confuso di Windows PowerShell è la varietà di modi in cui esso gestisce formati di testo. Ecco un quiz rapido: Quali sono le differenze tra questi tre comandi?

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

Tecnicamente, tutti e tre questi comandi produrrà un file di testo. È possibile aprire uno qualsiasi di questi tre file nel blocco note di Windows e leggere il contenuto. Due di tali file, tuttavia, utilizzare il testo per presentare i dati in un formato delimitato. C'è una struttura aggiuntiva all'interno del file che aiuta a separare le informazioni che hai creato.

I seguenti tre comandi sono legali e verranno eseguito senza errori:

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

Solo uno di questi comandi ha un senso, tuttavia. Il primo è quello solo sensibile. Si legge solo in un file di testo normale, non delimitato. Non è non formattato, perché se si guarda il file è chiaramente formattato.

È formattata in un certo senso umano, però. Il testo è in un bel tavolo colonnare. I dati sono disposto in modo che abbia un senso ai nostri occhi e cervello. Non è organizzato in modo che un computer consente di identificare facilmente i singoli bit di dati.

Questo è un concetto che turba molti nuovi arrivati di Windows PowerShell. C'è un tasto di scelta semplice che utilizzare per aiutare con questo. Se l'hai fuori dal guscio con un comando di esportazione, riportare nella shell con un comando di importazione. Se non utilizzi di esportazione, quindi non utilizzare importazione. Importazione ed esportazione sono verbi accoppiati. Essi dovrebbero sempre andare insieme. Quindi, se avete fatto questo:

Get-Service | Export-CSV services.csv

Poi si dovrebbe anche fare questo:

Import-CSV services.csv

Il comando Export-CSV accetta dati — in questo caso i dati sono informazioni sui servizi — e scrive i dati in un file. Singoli bit di dati sono delimitati da virgole, perché è quello che utilizza il formato CSV. Ciò significa che i nomi di servizio, status e così via sono tutti separati da virgole. Quando si leggono i dati con Import-CSV, Windows PowerShell analizza quelle virgole, re-separates i dati e ricostruisce i dati originali. Confrontare i risultati con i risultati di questo comando:

Get-Content services.csv

Che comando legge il testo, ma non fa nulla con esso. Lo schermo si riempie di valori separati da virgola, ma Windows PowerShell in realtà non separare i valori per te. Basta che stai ricevendo il testo grezzo, non analizzato, che è tutto Get-Content fa mai. Tecnicamente, Get-Content produce un oggetto String per ogni riga del file di testo. Che è utile in determinate situazioni, ma non è solitamente che cosa dovete fare con un file CSV.

Tutta questa situazione è analoga a qualcosa che probabilmente hai sperimentato in Windows pure. Aprire un file CSV in Notepad e cosa ottieni? Si vede un mucchio di testo. Questo è fondamentalmente ciò che sta facendo Get-Content. Ora aprite stesso file CSV in Excel, che cosa vedete? Si rompe il file CSV, separando i dati nelle colonne del foglio di calcolo. Questo è molto simile a quello che sta facendo Import-CSV.

Tutto questo perché è importante? Diciamo che si crea un file CSV. Vai avanti e utilizzare il blocco note per creare un file che assomiglia a questo (povero Greg Shields mai fa bene in questi esempi):

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

Salvare il file come utenti. csv sul tuo disco rigido e passare a un Windows PowerShell prompt. Non li esegue, si può indovinare ciò che ciascuno di questi due comandi farà?

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

Entrambi questi presupporre che hai già eseguito Import-Module ActiveDirectory per caricare il modulo Microsoft Active Directory, che viene fornito con Windows Server 2008 R2 ed è disponibile nel pacchetto Windows 7 Remote Server Administration Tools.

Il primo comando non funzionerà. Ecco perché Get-Content non è l'analisi del file. Esso è semplicemente inviando un mazzo di stringhe raw di ADUser nuovo. E ADUser nuovo non sarà in grado di fare qualcosa di utile con loro.

Il secondo comando funzionerà, perché la shell di analizzare il file CSV, scomposizione in singoli pezzi di dati e inviare quelli di ADUser nuovo. Perché i pezzi di dati — nome, samAccountName, dipartimento, titolo e città — lo stesso sono denominati come i corrispondenti parametri di ADUser nuovo, il secondo cmdlet creerà due nuovi utenti per avere le informazioni dal file CSV.

Questa è la differenza tra lavorare con testo normale (out-file e Get-Content) e delimitato da dati (Import/Export). Utilizzo dei file XML (Export-CliXML e Import-CliXML) è ancora meglio, poiché essi possono rappresentare le strutture dati più complesse come dati gerarchici. I file CSV sono un formato piatto che può rappresentare solo un singolo livello di dati.

Avvolgendo la testa in giro queste differenze è una delle cose più importanti che si possono fare in shell. Essere in grado di manipolare i dati nella pipeline è una delle cose che rende così potente Windows PowerShell. Trascorrere del tempo affinché si comprendere tutte le differenze — sia sottile e non così sottile.

Don_Jones

**Don Jones**è un Microsoft MVP Award destinatario e autore di "Imparare Windows PowerShell in un mese di pranzi" (Manning Publications, 2011), un libro progettato per aiutare qualsiasi amministratore diventa efficace con Windows PowerShell. Jones offre anche formazione di Windows PowerShell pubblica e in loco. Contatto con lui attraverso ConcentratedTech.com o bit.ly/AskDon.

Contenuto correlato