Windows PowerShell: coloro che dimenticare la storia

In un modo o nell'altro, Windows PowerShell può essere di grande aiuto, richiamando i comandi utilizzati più di recente.

Don Jones

"Chi dimentica la storia," il vecchio proverbio, "sono condannati a ripeterlo". Nel caso di Windows PowerShell, tuttavia, ti consigliamo di ripetere la storia, avrete bisogno di ricordarlo proprio. Windows PowerShell ricorda automaticamente comandi hai recentemente eseguire e li tiene in un buffer — o storia — così puoi ricordare più facilmente ed eseguire di nuovo.

Scelte storiche

Quando si utilizza la console Windows PowerShell, in realtà si può lavorare con due tipi di cronologia dei comandi. I due sono completamente indipendenti e non hanno nulla a che fare con l'altro.

Il primo è il buffer da riga di comando, con cui hai probabilmente familiarità. Questo è ciò che esce quando si preme il tasto freccia su per richiamare un comando run in precedenza. È anche possibile premere F7 per ottenere un menu di comandi precedentemente in esecuzione. Una volta si vede il menu, utilizzare i tasti freccia per selezionare un comando e premere invio, e verrà eseguito.

Il buffer da riga di comando mantiene i comandi ultimi 50 per impostazione predefinita. Si possono aumentare o diminuire tale impostazione modificando le proprietà della finestra della console stessa. Fare clic sulla casella di controllo della finestra e scegliere Proprietà. Modificare la dimensione di "Dimensione del buffer storia comando" nella scheda opzioni.

Questa storia di comando è effettivamente separata da Windows PowerShell stesso. Si è mantenuto dall'applicazione console-hosting. Windows PowerShell non è nemmeno a conoscenza che questo esiste.

Una storia che è possibile utilizzare

La storia di Windows PowerShell stesso mantiene è più utile. Get-Command –noun cronologia per vedere i quattro cmdlet incorporati che si occupano di questo registro storia estesa di esecuzione:

  • Aggiungere-storia
  • Clear-History
  • Get-History
  • Richiamare-storia

C'è anche una variabile incorporata: $MaximumHistoryCount. Consente di impostare la dimensione del buffer storia comando interno Windows PowerShell. È impostata su 64 per impostazione predefinita. Se si desidera modificarla, basta impostare la variabile su un nuovo valore. Tutte le modifiche apportate sarà attive solo per la sessione corrente di shell. Se si desidera apportare la modifica più permanente, aggiungere qualcosa come il seguente script profilo:

$MaximumHistoryCount = 100

Che potrebbe andare in un file denominato [mio] Home\Documenti\WindowsPowerShell\Profile.ps1, che è uno dei quattro script automaticamente eseguito il profilo per il quale la shell cerca.

Get-History è il principale cmdlet che guarderemo, come è probabilmente il più utile dei quattro. Produce oggetti del tipo HistoryInfo. Tali oggetti contengono quattro proprietà che troverete interessanti:

  • Riga di comando: il comando effettivo che è stato eseguito
  • StartExecutionTime: il tempo iniziato il comando
  • EndExecutionTime: il tempo finì il comando
  • ExecutionStatus: lo stato del comando dopo il completamento; Questo sarà qualcosa come "Completato" o "Stopped"

Combinando questi oggetti con altri comandi di Windows PowerShell è dove le cose cool comincia davvero. Si supponga, ad esempio, aprire una finestra della shell di nuovo di zecca e faticosamente eseguire più comandi specifici per completare un compito complesso. Vuoi trasformare tali comandi in uno script, in modo da poter eseguire loro in quell'esatto ordine ripetutamente? Solo fare questo:

Get-History | Selezionare la riga di comando –Expand | Out-file script.ps1

Il trucco è il parametro –ExpandProperty di Select-Object. Causa Select-Object per uscita solo il contenuto della proprietà specificata. In questo caso, è la proprietà CommandLine degli oggetti HistoryInfo. Questi contengono il testo dei comandi che appena eseguito. Quindi è possibile modificare il file risultante di Script.ps1 in Windows PowerShell ISE o un altro editor di script per ottimizzare i comandi, trasformare i valori hardcoded in parametri, rimuovere tutti i comandi che non si desidera e così via.

Supponiamo che hai fatto questo trucco e liquidata con il seguente file Script.ps1:

Import-Module ActiveDirectory
Import-CSV users.csv
Import-CSV users.csv | New-ADUser –path "ou=sales,dc=company,dc=com"

Che può essere un esempio piuttosto breve, ma tramite l'esecuzione di tali comandi in modo interattivo, è possibile verificare che lavorerò — un passo alla volta. In realtà, si può vedere dove il secondo comando era solo una importazione di prova di file CSV. Questo assicura semplicemente che ha i dati previsti. Quindi è possibile ripulire lo script e aggiungere parametri:

Param(
  [string]$filename = &(Read-Host "Specify input CSV filename"),
  [string]$path = "cn=Users,dc=company,dc=com"
)
Import-Module ActiveDirectory
Import-CSV $filename | New-ADUser –path $path

Il comando di "importazione di prova" e i parametri aggiunti raccolgono il nome del file CSV e destinazione OU. Questo è un approccio migliore rispetto a lasciare quei valori hardcoded. Assicurarsi che chi viene eseguito questo script verrà richiesto per un nome di file se dimenticano specificare una (questo è il tipo di un brutto modo di fare che spingendo — una funzione avanzata fornirebbe un mezzo più pulito, più coerenza di farlo). Per il secondo parametro, specificare un valore predefinito che sarà sufficiente se qualcuno non specifica un valore alternativo.

Questo è un modo semplice per prendere un processo che manualmente avere una volta completato e rapidamente trasformarsi in una sequenza ripetibile di azioni che anche qualcun altro potrebbe utilizzare.

Più storia trucchi

La capacità di "ottenere" la storia della riga di comando offre numerosi altri trucchi puliti:

  • Get-cronologia di esecuzione | Esportazione-CliXMLfilename per esportare i comandi in un file XML. Inviare il file XML a un collega, e rapidamente si possono ripetere quei comandi eseguendo Import-CliXMLfilename | Richiamare-storia.
  • Utilizzare le proprietà StartExecutionTime ed EndExecutionTime per misurare il tempo impiegato per completare un comando. Ad esempio: get-history | selezionare commandline,executionstatus,startexecutiontime,endexecutiontime,@{n='ExecutionDuration';e={$_.EndExecutionTime-$_.StartExecutionTime}}
  • Individuare rapidamente passato comandi senza dover scorrere con il tasto freccia su. Ad esempio, se si conosce è stato eseguito un comando che usato "Select", prova questo trovarlo: get-history | dove {$_.Riga di comando-come ' * selezionare *' }

Come sempre, Windows PowerShell considera tutto come un oggetto, piuttosto che una massa di testo. Questo rende questo tipo di ricerca e filtraggio molto più pratico rispetto se si erano la scansione attraverso un file di log di testo o qualcosa di altrettanto ingombrante.

Don Jones

Don Jones è un Microsoft MVP Award destinatario e autore di "Imparare Windows PowerShell in un mese di pranzi" (Manning Publications co., 2010), un libro progettato per aiutare ogni amministratore di diventare efficace con Windows PowerShell. Jones offre anche la formazione di Windows PowerShell pubblici e in loco. Contattarlo tramite il suo sito Web a ConcentratedTech.com.

Contenuto correlato