Windows PowerShell. Nuova shell, nuova sintassi

Alcuni nuovi comandi nella sintassi della versione 3 di Windows PowerShell consentono di scrivere comandi più semplici da leggere, ma con alcune limitazioni.

Don Jones

Una delle nuove funzionalità di Windows PowerShell versione 3 è una nuova forma di sintassi per il cmdlet Where-Object e ForEach-Object. Entrambi questi cmdlet normalmente accettare un scriptblock (nel caso di Where-Object, ha chiamato un filterscript, perché deve restituire sono $True o $False).

All'interno di tale scriptblock, utilizzare il simbolo $_ segnaposto per rappresentare "tutto ciò che è stato reindirizzato al cmdlet." Ecco un esempio di utilizzo di entrambi i cmdlet (questo non è un comando sensibile del mondo reale, ma esso viene illustrato l'utilizzo dei cmdlet):

Get-WmiObject –class Win32_LogicalDisk | Where-Object –filterscript{ $_.DriveType –eq 3 } | ForEach-Object –process { $_.ChkDsk() }

Mai vedere questi comandi scritti da queste parti. Persone tendono a utilizzare gli alias, i nomi di parametro troncato e parametri posizionali per salvare la battitura a macchina. Di seguito non è insolito:

gwmi Win32_LogicalDisk | ? { $_.DriveType –eq 3 } | % { $_.ChkDsk() }

C'è niente come un po ' Arcana sintassi per garantire la sicurezza del lavoro, giusto? Nuova sintassi dell'oggetto dove ti permette di fare questo:

gwmi Win32_LogicalDisk | where DriveType –eq 3 | % { $_.ChkDsk() }

Notate che ho passato a un alias differente per il cmdlet. È comunque possibile utilizzare? Se si desidera, ma che mi fa impazzire. Io vengo da uno sfondo molto tempo base, dove? era una scorciatoia per l'istruzione Print. Leggendo? in un Windows PowerShell comando fa male il mio cervello. Io ho rinunciato anche con le parentesi graffe e il simbolo $_.

In sostanza, Where-Object ha ora un parametro posizionale ad accettare la proprietà che si desidera filtrare su (nel mio esempio DriveType). Esso definisce tutti i principali operatori Windows PowerShell (- eq, - ne, - piace, - gt e così via) come parametri. Il valore di tale parametro è il valore che si desidera filtrare (qui, il valore è 3). Questa forma abbreviata è più facile da leggere, ma è possibile utilizzare solo per un singolo confronto. Ad esempio, di seguito non è una dichiarazione legale:

Gwmi Win32_Service | Where StartMode –eq 'Auto' –and State –ne 'Running'

Per questo, è necessario tornare alla vecchia scuola sintassi:

Gwmi Win32_Service | Where { $_.StartMode –eq 'Auto' –and $_.State –ne 'Running' }

Oggetto ForEach ottiene una forma simile, segni di punteggiatura ridotto sintassi:

gwmi Win32_LogicalDisk | where DriveType –eq 3 | foreachChkDsk()

Ancora una volta, ho ho acceso all'alias ForEach anziché % per rendere questo più facile da leggere. Si potrebbe continuare a utilizzare % se ti piace. Uno dei miei colleghi MVP ha scritto un blog grande articolo su queste accorciato forme, ed è la pena di leggere. Egli introduce anche $PSItem, che sembra essere un supplente per il simbolo di _ $ spesso frainteso.

Personalmente, ho sentimenti contrastanti su queste nuove forme di sintassi. Da un lato, sono sicuramente più facile per un nuovo arrivato a cogliere. Eliminando le parentesi graffe e la confusione sempre $_ è grande. D'altra parte, queste nuove forme non sono completamente funzionale. Può fare solo un singolo confronto. Sarà ancora necessario imparare la vecchia sintassi.

Inoltre, ci sono più di sei anni di vecchio stile sintassi galleggianti intorno nel popolare blog, articoli di riviste e libri. Si sta ancora andando ad avere bisogno di conoscere la vecchia sintassi al fine di dare un senso di tali esempi.

Così questa nuova sintassi non elimina la necessità di conoscere la vecchia sintassi. Significa solo che avete due forme di ricordare invece di uno. Tuttavia, esso è ciò che abbiamo da lavorare, quindi questo è il modo che lavoreremo.

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 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