Windows PowerShell: Pensare ai comandi e non agli script

Non essere intimidated con il termine “ script ”, poiché è possibile fare molto con Windows PowerShell utilizzando semplici comandi.

Don Jones

Percezione è stato uno dei maggiori struggles che Windows PowerShell ha avuto in termini di accettazione dell'amministratore. È presente una percezione sospeso che la shell è “ linguaggio script ”, equivale a VBScript. Mentre molti amministratori love cosa si può fare con un linguaggio di script, plenty più sono disattivati per la percezione di complessità e una curva di apprendimento steep.

È un peccato. La shell supporta un approccio basato su script potente, ma altrettanto bene in un approccio orientato ai comandi più semplice. La vera bellezza della shell è che è possibile utilizzare entrambi gli approcci per eseguire molte delle attività.

Solo script

La seguente funzione accetteranno i nomi di computer dalla riga di comando come stringhe o nella proprietà dell'oggetto di input; “ nomecomputer ”recupererà inoltre le informazioni del BIOS e del sistema operativo da ogni computer tramite Strumentazione gestione Windows (WMI):

function Get-Inventory
{
   [CmdletBinding()]
   Param(
       [Parameter(Mandatory=$true,
                 ValueFromPipeline=$true,
                 ValueFromPipelineByPropertyName=$true)]
       [string] $computername
   )
   Process {
      $os = gwmi win32_operatingsystem -computername $computername
      $bios = gwmi win32_bios -computername $computername
      $obj = new-object psobject
      $obj | add-member noteproperty ComputerName $computername
      $obj | add-member noteproperty OSBuild ($os.buildnumber)
      $obj | add-member noteproperty SPVersion ($os.servicepackmajorversion)
      $obj | add-member noteproperty BIOSSerial ($bios.serialnumber)
      Write-output $obj
   }
}

Nota che le parentesi forzare la shell per eseguire espressioni, ad esempio la proprietà BuildNumber dall'oggetto nella variabile $ os e restituiscono il risultato dell'espressione come valore del terzo parametro del membro Add.

È inoltre possibile eseguire questa funzione da piping in nomi computer statico:

'localhost','server2' | Get-Inventory

Oppure inviando il contenuto del testo in un file contenente un nome computer per riga:

Get-Content names.txt | Get-Inventory

O anche il recupero di oggetti computer da Active Directory, modificando la proprietà Name per nomecomputer e inviando quelli:

Import-Module ActiveDirectory
Get-ADComputer –filter * | Select-Object @{Label='ComputerName';Expression={$_.Name}} | Get-Inventory

A proposito, utilizzare le parentesi graffe per incapsulare il codice eseguibile. $ _ Segnaposto rappresenta l'oggetto reindirizzato nel cmdlet Select-Object. I risultati di questi sono una tabella a quattro colonne perfettamente formattata. È facilmente possibile reindirizzare l'output a un file, stampanti o griglia, o anche filtrare e ordinare i risultati prima di visualizzarli. Ad esempio:

Get-Content names.txt | Get-Inventory | Where { $_.BuildNumber –eq 7600 } | Sort ComputerName

Ancora una volta, le parentesi graffe incapsulano un blocco di codice eseguibile, l'espressione che si desidera filtrare, e $ _ segnaposto rappresenta l'oggetto in reindirizzato.

Comando Performance

Non c'è niente errato con uno script simile, ma funziona piuttosto difficile. È un approccio di tipo script o programmatore di amministratori sufficiente trovare intimidating. È Impossibile effettuare la stessa operazione in un comando singolo, piuttosto complessa. Parentesi graffa manualmente:

Get-WmiObject Win32_OperatingSystem -computername (get-content names.txt) | 
Select-object @{Label="ComputerName";Expression={$_.__SERVER}},
             @{Label="OSBuild";Expression={$_.BuildNumber}},
             @{Label="SPVersion";Expression={$_.ServicePackMajorVersion}},
             @{Label="BIOSSerial";Expression={(gwmi win32_bios -comp $_.__server).serialnumber}}

È molto presente in corso. Di seguito è riportata una descrizione dettagliata

  1. Eseguire innanzitutto Get-WMIObject per recuperare l'oggetto Win32_OperatingSystem dai nomi computer specificato. Nel caso di un normale lettore di questa colonna, si saprà che gli oggetti restituiti da Get-WMIObject sempre includerà una proprietà __SERVER, che contiene il nome di computer provengono gli oggetti WMI.
  2. Oggetti WMI vengono reindirizzati a Select-Object. Quattro tabelle hash viene utilizzato per definire quattro proprietà: Nomecomputer, OSBuild, SPVersion e BIOSSerial. Ogni tabella hash specifica un'etichetta, che verrà successivamente utilizzato come intestazione di colonna per l'output e un'espressione. Hashtable viene costruita utilizzando il @ operatore di matrice seguita dalla definizione di etichetta o espressione tra parentesi graffe. Le parentesi graffe racchiudono il codice eseguibile che definisce la parte di espressione della tabella hash.
  3. Per le prime tre colonne, l'espressione fa riferimento semplicemente a una proprietà esistente dell'oggetto;Fondamentalmente sta semplicemente cambiando il nome proprietà.
  4. Per la quarta colonna l'espressione effettiva è in esecuzione una seconda query WMI sul server stesso. Esso è estrarre il nome di computer dalla proprietà __SERVER. Vedere come l'intera chiamata WMI è racchiusa tra parentesi? Quelli di imporre l'espressione da eseguire prima. Qualsiasi oggetto risultante dall'espressione verrà inserito in sostituzione della parte tra parentesi. Il periodo successivo alla parentesi di chiusura consente accesso alle proprietà dell'oggetto risultante, in modo che attiva l'accesso di sua proprietà SerialNumber per la quarta colonna.

In alcuni modi, questa sintassi è più difficile da leggere rispetto a script con cui iniziare. È compatto e utilizza una grande quantità di punteggiatura. Questo è il tipo di elemento è possibile utilizzare come modello e modificarlo secondo le proprie esigenze. Se è Impossibile capire perché non è funzionante, inserire una domanda sul mio blog all'indirizzo ConcentratedTech.com e ti aiuterò figura.

Non chiamare IT uno script

Il punto è che Windows PowerShell non deve necessariamente essere utilizzato come un linguaggio di script. Il comando è stato illustrato potrebbe essere complesso, ma è più complesso rispetto a quello di alcuni comandi far-out ho visto amministratori scrivere per la shell cmd.exe precedente. Una volta abituati alla sintassi, che accetta verità alcune esercitazioni, il comando è molto meno complesso rispetto alla scrittura completo-script o funzione.

Pertanto, non lasciare il termine ” linguaggio di script “ attiva lontano dalla shell. È solo come “ scripty ” come desiderato.

Don Jones

Don Jones è un fondatore di tecnologia incentrati e risposte alle domande su Windows PowerShell e altre tecnologie di ConcentratedTech.com. È anche autore di Nexus.Realtimepublishers.com, molti dei suoi libri rende disponibile come libere edizioni elettroniche tramite il suo sito web.

Contenuto correlato