Condividi tramite


Windows PowerShell Filtro a sinistra, formato a destra

Don Jones

Contenuti

Filtro a sinistra, con l'origine
Formato a destra, e si sta fine con IT
Le quinte

Della lista di Windows PowerShell Most Valuable Professional (MVP), abbiamo recente stato discussione e il tentativo di documento, Windows PowerShell “ aspetti negativi. ” È possibile conoscere cosa intendiamo: gli elementi di poco don’t esattamente il funzionamento ritieni farebbero, e che effettivamente può causare problemi quando si formazione la shell.

Due dei principali aspetti negativi riguardano filtraggio e formattazione. Ho accennato nell'elenco che ho tentato di per utenti di evitare il problema in tali aree, ricordando di "a sinistra di filtrare, formattare a destra". Si è verificato a me che l'espressione può essere una buona base per una colonna in utilizzo più efficace di Windows PowerShell, sono qui.

Filtro a sinistra, con l'origine

Utilizzo disponibile Active Directory (AD) gestione cmdlet di Quest (è possibile individuarli in quest.com/powershell) molto e incoraggiare altri utenti, troppo. Un cmdlet, Get-QADUser, è progettato per recuperare gli utenti da Active Directory. Gli utenti di eseguire un comando di questo tipo di visualizzazione non è insolito che:

Get-QADUser | Where-Object { $_.Department -eq "Sales" } | Set-QADUser -department "Inside Sales"

Questo potrebbe modificare tutti gli utenti cui attributo di reparto in Active Directory è impostato su vendite, l'attributo è stato impostato in vendite. Il problema è il filtro in cui sta accadendo. Il primo cmdlet, Get-QADUser, consentirà di recuperare ogni singolo utente dall'intero dominio.

Fortunatamente, non verrà recuperati tutti gli attributi da ogni utente per impostazione predefinita e in un dominio grandi dimensioni, esso verrà danni più sufficiente come controller di dominio scarsa struggles (DC) per trasmettere informazioni account utente al computer client. Il client deve esaminare ogni account, uno alla volta, quindi ignorare quelli che non dispongono di un attributo di reparto contenente il valore di vendita. Quali uno spreco!

Ecco perché mi piace per "filtrare a sinistra." Sempre spostare i criteri di filtro fino a sinistra della riga di comando ha come possible.In questo caso, il cmdlet Get-QADUser stesso accade supporta il filtraggio:

Get-QADUser -Department "Sales" | Set-QADUser -department "Inside Sales"

C'è non è più che sia necessario per il cmdlet Where-Object. Ancora migliore, utilizzando questa sintassi, Get-QADUser trasmettere i criteri di filtro per il controller di dominio e il controller di dominio è il recupero e la trasmissione di soli account che soddisfano i criteri. Controller di dominio sono fantastico al filtro, non giorno long, effettivamente, in modo che si sta inserendo il filtro nella posizione migliore possibile per l'esecuzione rapida. Il client non è necessario affrontare tutti gli oggetti provenienti dal controller di dominio, in modo che il comando non eseguirà più veloce ed efficiente.

Ecco un altro esempio, utilizzando Strumentazione gestione Windows (WMI):

Get-WmiObject CIM_DataFile -computerName Server2 | Where { $_.FileName -like "*.dll" }

Questo potrà contattare WMI sul Server2, ottenere tutte le istanze della classe CIM_DataFile, che rappresenta il file sul disco rigido ed escludere quelli che non sono file DLL. Pertanto è lasciata con un elenco di file DLL su tale server. Ma questo verrà tempi di esecuzione, si sta portando tutte informazioni del file del server al computer. Anche in questo caso, consente di spostamento sinistra ulteriormente il filtro e, in questo caso, è possibile eseguire questa operazione:

Get-WmiObject CIM_DataFile -computerName Server2 -filter "FileName LIKE '*.dll'"

È necessario utilizzare sintassi di filtro leggermente diverso perché questa sintassi non è in esecuzione da Windows PowerShell. Invece della fase di trasmissione WMI sul computer remoto. Ancora richiederà tempo di esecuzione, ma implica minore traffico di rete e, infine, un carico minore sia Server2 per il computer. Ottenere l'abitudine di lettura dei cmdletvedere le opzioni di filtro offre un cmdlet consentono di file (Guida-Get-WMIObject, in questo caso). Solo si affidano Where-Object quando Get-* cmdlet che si sta utilizzando non supporta il filtro è necessario.

Formato a destra, e si sta fine con IT

Si riferisce l'altri trabocchetto formato-* cmdlet, ad esempio Format-Table e Format-List. Noterà newcomers eseguire qualcosa di simile:

Get-Process | Format-Table ID,VM,Name | Export-CSV c:\processes.csv

Non funziona. Oh, esso verrà eseguito, ma i risultati non soddisfacenti. E, se si esegue una seconda realmente leggere tale comando, si potrebbe chiedersi esattamente quello previsto si verifica comunque. È stata ottenuta una serie di processi, applicato una tabella, e quindi si desidera in qualche modo la tabella per diventare un file CSV? Se lo scopo finale è ottenere un file CSV che contiene solo alcune proprietà dell'oggetto, eseguire questo:

Get-Process | Select-Object ID,VM,Name | Export-CSV c:\processes.csv

Se l'obiettivo è ottenere una tabella formattata, a colonne in un file di testo, è necessario eseguire questa operazione:

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

Ma è Impossibile combinare e corrispondono a questi due approcci. Comprendere perché l'operazione di richiede in background sul funzionamento dei cmdlet di formato, unitamente a come out-* cmdlet funzionare.

La pipeline di Windows PowerShell, che è i comandi da eseguire - è hardcoded per terminare nel Out-Default cmdlet. Questo cmdlet poco più di reindirizzare oggetti da Out-Host, che è responsabile della visualizzazione dell'output sullo schermo.

Qualsiasi riga di comando, o la pipeline, utilizzare il termine corretto, che non termina in uscita-* cmdlet, in base all'impostazione predefinita, terminerà in Out-Default, che corrisponde a quello che informa termina in Out-Host. Il trucco è che in uscita-* cmdlet non conoscono cosa fare con gli oggetti, è necessario che tali oggetti convertite in istruzioni di formattazione. Pertanto quando Out-Host Ottiene gli oggetti processo, invia gli oggetti a uno dei formato-* cmdlet. Quale dei due viene utilizzato, Table, Wide, personalizzata o elenco, si basa su un insieme di regole che potrà essere trattati in questa colonna. Ma invierà gli oggetti da uno di essi e il formato-* cmdlet accetta gli oggetti e genera le istruzioni di formattazione. Uscita-* cmdlet sapere come utilizzare le istruzioni di formattazione e li utilizzano per creare qualsiasi tipo di visualizzazione è necessario.

Pertanto è opportuno inserire che in termini pratici: Esistono tre o quattro principale out-* cmdlet che si verrà rilevano e utilizzare regolarmente: Out-Host, Out-File, Out-Printer e Out-String.

Questi sono progettati per utilizzare solo le istruzioni di formattazione ed eseguire le istruzioni per creare una visualizzazione su schermo, un file di testo, una pagina della stampante oppure una stringa, rispettivamente. L'unico modo per accedere a queste istruzioni di formattazione consiste eseguire oggetti tramite un formato-* cmdlet, e le istruzioni di formattazione sono l'unica formato-* producono cmdlet. In tal caso quando si esegue questo:

Get-Process | Format-Table ID,VM,Name |Export-CSV c:\processes.csv

che consente di spostarsi in un file con estensione csv sono le istruzioni di formattazione prodotta da Format-Table, probabilmente non tutto è quello previsto. Dopo l'esecuzione di un formato-* cmdlet, gli oggetti originali vengono persi e sta lasciati con le istruzioni di formattazione. Ecco un'altra regola semplice per l'utente: Formato a destra. Premi in altre parole, il cmdlet di formattazione per estrema destra della riga di comando. L'unica cosa che può seguono un formato-* cmdlet è un ritorno a capo o un'uscita-* cmdlet. Ecco perché questo è valido:

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

Out-File sa come leggere le istruzioni di formattazione e utilizzarli per creare un file di testo. È anche legale:

Get-Process | Format-Table ID,VM,Name 

In questo caso, sta affidarsi Out-Default hardcoded, che reindirizza Out-Host, che sanno come utilizzare le istruzioni di formattazione e creare una visualizzazione di testo nella finestra host o console. Mantenere la formattazione come molto verso destra quando possibile, seguito da nulla o da out-* cmdlet che sarà corretta.

Un suggerimento ulteriori: Non deve seguire un out-* cmdlet perché, con sola eccezione, nessuno di essi creare oggetti per la pipeline. Non c'è alcun senso disporre di alcuna seguire out-* cmdlet, perché non sarà di esso.

Le quinte

Spero che ho aiutato alcuni comprendere perché questi aspetti negativi rappresentano il metodo sono. Ma, come minimo, ricordare "filtrare a sinistra, formato a destra"e deve essere in grado di rimanere fuori problemi evitando completamente tali aspetti negativi.

Molte delle quirks minima di Windows PowerShell diventano più facili da comprendere una volta compreso realmente come e perché la shell funziona in modo affermativo. Il tempo per ciò che accade in dettaglio e applicare tali conoscenze ogni volta che si stanno ottenere risultati imprevisti nella shell, rapidamente renderà è un guru di Windows PowerShell.

Don Jones è uno del paese di insegnanti professionisti più esperti di Windows PowerShell e writer. Suggerimenti di settimanale Windows PowerShell ha blog in ConcentratedTech.com; inoltre, è possibile contattarlo o domande lui non esiste.