Windows PowerShell. Sintassi con scelte rapide

Con Windows PowerShell esistono solitamente diversi modi per eseguire la stessa operazione. Occorre solo trovare quella più adatta alle proprie esigenze e utilizzarla.

Don Jones

Una delle cose che io sia amore e odio su Windows PowerShell è la sua flessibilità intrinseca. In molti modi, è scritto come un linguaggio di programmazione. Se non sei un programmatore, puoi ignorare che praticamente e trattarla come un guscio della riga di comando.

Beh, forse non completamente "ignorare." Vedete, ci sembrano essere sempre tre o quattro modi diversi di fare quasi nulla in Windows PowerShell. Veramente solo bisogno di sapere l'unico modo che ha più senso per voi. Un utente di Windows PowerShell intelligente, tuttavia, sarà familiare con tutti i mezzi con cui di compiere una determinata attività. In questo modo, quando stai guardando esempi scritti da altre persone, sarete in grado di dare un senso di quello che stai vedendo.

Tutto su Alias

Gli alias sono il prima "scorciatoia" si incontrano la maggior parte di voi. È possibile utilizzare questo comando:

PS C:\> Get-WmiObject -class Win32_LogicalDisk -Filter "DriveType=3" | >> Where-Object -FilterScript{ $_.FreeSpace / $_.Size -lt .1 } | >> Select-Object -Property DeviceID,FreeSpace,Size >>

Si può e come scorciatoia così:

PS C:\>gwmi Win32_LogicalDisk -Fi "DriveType=3" | >> ?{ $_.FreeSpace / $_.Size -lt .1 } | >> SelectDeviceID,FreeSpace,Size >>

Ho usato gli alias al posto dei nomi di comando, e io ho troncato i parametri a un minor numero di caratteri. Windows PowerShell consente di troncare i nomi dei parametri, purché si forniscono abbastanza di ogni nome di parametro per poter essere identificato in modo univoco. Questo rende meno battitura a macchina, ma un comando molto più difficile da leggere. Io consiglio miei studenti compitare tutto quando stai pubblicando un esempio, salvandolo in uno script o altrimenti rendendolo un artefatto permanente. Questo renderà più facile l'individuazione più tardi.

In Windows PowerShell ISE e la maggior parte degli altre editor, potete digitare la porzione troncata del nome del parametro e premere Tab per finire digitando il nome intero. C'è meno digitando — ed è più facile da leggere. Ho completamente ho omesso altri nomi di parametro, perché sono i parametri posizionali. In altre parole, finché mi ricordo ottenere tutti i valori in fila nell'ordine giusto, il comando funziona ancora.

Ancora una volta, troncati i nomi non sono facili da leggere. Maggior parte delle persone apprezzeranno voi utilizzando il nome completo del parametro in uno script. Utilizzando il nome completo del parametro è in definitiva meno lavoro su di voi, perché non si deve ricordare che ordine vengono in. Quando si utilizzano nomi, si può mettere in qualsiasi ordine desiderato.

Espressioni tra virgolette

Occasionalmente sarà necessario inserire un risultato di espressione in una stringa tra virgolette. Ciò consente di includere tale risultato nell'output di script. Un modo per farlo è memorizzare il risultato in una variabile. Utilizzare quindi il trucco di Windows PowerShell di inserimento variabili in stringhe tra virgolette doppie. Windows PowerShell andrà a sostituire la variabile con il suo contenuto:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" $freepercent = $disk.freespace / $disk.size * 100 Write-Host "Free space on drive C: at $freepercent percent"

Windows PowerShell consente anche di mettere l'espressione completa all'interno di virgolette doppie. La sintassi è derivata da un trucco di shell Unix. Che sembra un po ' strano, ma vedrai gente usarlo molto:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" Write-Host "Free space on drive C: at $($disk.freespace / $disk.size * 100) percent"

Io preferisco la prima forma, soprattutto perché tendono a lavorare per lo più con i principianti di Windows PowerShell. La prima forma è un po' più facile da leggere. Una cosa che accade in ogni passaggio dello script, rendendo un po' più facile da seguire la logica.

Windows PowerShell utilizza abbastanza segni d'interpunzione che la seconda forma pare più confusa. Tuttavia, la seconda forma è anche tecnicamente un po' più efficiente. Esso non è la creazione di una variabile contenente Windows PowerShell per tenere traccia. Essa comporta anche un pochino meno tipizzazione, che la maggior parte di voi sembra piacere.

Creazione di oggetti

La forma lunga ancora una volta è utile quando è necessario creare un oggetto personalizzato:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version $obj | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer $obj | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model Write-Output $obj

A volte I'll scorciatoia questo solo un po ' utilizzando questa tecnica, che associa i comandi Add-Member in una singola tubazione:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version –PassThru | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer –PassThru | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model –PassThru

Recentemente, ho iniziato a passare a una tecnica leggermente diversa, che è anche più leggibile:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $props = @{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model} $obj = New-Object -TypeNamePSObject -Property $props Write-Output $obj

Ancora una volta, la mia preferenza per questo tipo di sintassi long-form è causa della sua leggibilità. Lavoro principalmente con i nuovi arrivati Windows PowerShell, quindi leggibilità è cruciale nell'aiutarli a capire cosa sta succedendo. Vedrete anche gente utilizzare questo trucco:

$obj = Select-Object OSVersion,Mfgr,Model $obj.OSVersion = $os.version $obj.Mfgr = $cs.manufacturer $obj.Model = $cs.model $obj

I risultati sono le stesse, e che una ultima utilizza un po' meno digitando. Essa è sorta di un trucco di hacker per utilizzare Select-Object in questo modo. Esso è approfittando del fatto che si può dire Select-Object per selezionare una proprietà inesistente. Creerà effettivamente la proprietà con un valore vuoto sull'oggetto di output.

Esso in realtà mi addolora vedere Select-Object utilizzati (o, più precisamente, usurpata) in questo modo e io non sono l'unico. Già nel 2008, alcuni colleghi Windows PowerShell MVP erano parlare contro questo uso. Indipendentemente da come senti su questa tecnica, si dovrebbe imparare a riconoscerlo in modo che voi saprete cosa fa.

In Windows PowerShell versione 3, in realtà sarete in grado di fare questo:

[pscustomobject]@{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model}

Non ho deciso come mi sento su questa sintassi, ma generalmente è OK. Esso è ancora abbastanza leggibile ed elimina un po ' di battitura a macchina. Gente inizierà usandolo come pure, così si dovrebbe riconoscere per quello che è. L'ultima tecnica sembra anche di eseguire più velocemente (per saperne di più sul blog di Jonathan Medda).

Oggetto scorciatoie

La tecnica di scelta rapida scorsa che vedrete spesso è simile alle stringhe di espressioni. Questo è totalmente legale sintassi di programmazione — appena può essere fonte di confusione per i nuovi arrivati. Eppure, ci è niente "sbagliato" con esso, così si dovrebbe abituarsi a vederla e so quello che fa.

Dire che vuoi eseguire qualche metodo di un oggetto, e poi fare qualcosa con una delle proprietà dell'oggetto risultante, in questo modo:

$string = ' Hello ' $string = $string.Trim() $string.Length

Tutto ciò che è possibile scelta rapida utilizzando le parentesi. L'espressione tra parentesi viene valutata in primo luogo, e Windows PowerShell sostanzialmente sostituisce la parentesi con il risultato:

$string = ' Hello ' ($string.Trim()).length

Lo stack fino la punteggiatura molto, quindi è un po' più difficile per il tuo cervello tirare a parte i pezzi e determinare cosa sta succedendo, ma è completamente legale. Potrebbe anche eseguire un pochino più veloce, perché Windows PowerShell non ha manipolare la variabile come tante volte.

Mi dispiace per tutto ciò che

In qualche modo, la sua sfortunata Windows PowerShell non poteva offrire solo un modo di fare qualsiasi cosa. Poi siamo tutti solo avrebbe dovuto imparare che un modo. Così com'è, abbiamo un guscio che offre un sacco di variazioni di sintassi differente per ciò che è essenzialmente lo stesso compito. Vale la pena di essere almeno familiarità con le molte alternative di sintassi. In questo modo, si può fare uso di qualunque esempi si incontrano.

Raymond Chen

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 ogni amministratore di diventare effettiva con Windows PowerShell. Jones offre anche la formazione di Windows PowerShell pubblici e in loco. Contattarlo tramite ConcentratedTech.com o bit.ly/AskDon.

Contenuto correlato