11Sep

Geek School: lavorare con le raccolte in PowerShell

click fraud protection

Poiché PowerShell è basato su. Net Framework e incorpora varie altre tecnologie come WMI e CIM, c'è sempre più di un modo per realizzare la stessa cosa. Vieni con noi per questo breve post in cui impariamo come scegliere il metodo migliore per svolgere i nostri compiti.

Leggere gli articoli precedenti della serie:

  • Imparare come automatizzare Windows con PowerShell
  • Imparare a utilizzare i cmdlet in PowerShell
  • Imparare come utilizzare gli oggetti in PowerShell
  • Imparare la formattazione, il filtraggio e il confronto in PowerShell
  • Imparare a utilizzare i servizi remoti inPowerShell
  • Utilizzo di PowerShell per ottenere informazioni sul computer

E rimanere sintonizzati per il resto della serie per tutta la settimana.

Utilizzo di batchmemlet batch

In precedenza nella serie, quando abbiamo introdotto la pipeline, abbiamo mostrato come è possibile prelevare gli oggetti che un cmdlet emette e passarli come input a un altro cmdlet usando qualcosa di simile:

instagram viewer

Get-Process -Nome notepad |Stop-Process

Questo ucciderebbe qualsiasi processo con il nome "notepad".Ma probabilmente ti starai chiedendo come PowerShell sia in grado di uccidere ogni istanza del blocco note con un singolo comando. La risposta si trova all'interno del cmdlet Stop-Process.

help Stop-Process -FULL

Se si guarda l'ultima riga di codice nella sezione di sintassi, si può vedere che il parametro InputObject accetta un oggetto di tipo Process [] e ogni volta che si vede un tipo seguito da due parentesi quadre comeciò significa che il parametro accetta uno o più del tipo precedente. In questo caso, accetta uno o più oggetti processo. Tecnicamente, potremmo dire che il cmdlet InputObject accetta un array di processo. Ogni volta che si dispone di un cmdlet che supporta le operazioni batch in questo modo, utilizzarlo. Questa è la scelta numero uno.

Utilizzo di WMI

Sebbene WMI non sia il miglior componente tecnologico fornito dal Microsoft HQ, viene in secondo piano nell'elenco di come lavorare con le raccolte di oggetti.È possibile ottenere facilmente un elenco di processi in esecuzione dalla classe Win32_Process in questo modo:

Get-WmiObject -Class Win32_Process

Poiché la query WMI restituisce il proprio tipo di oggetto, sarà necessario cercare un metodo che possa arrestare il processo, quindilascia che pipe per Get-Member.

Get-WmiObject -Class Win32_Process |Get-Member

Sembra che la cosa più vicina da interrompere sia il metodo terminate, quindi deve essere quello. Per chiamare un metodo su un oggetto WMI, basta collegarlo a Invoke-WmiMethod e specificare il nome del metodo.

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Terminate

Grande, questo ha fatto il trucco. Ogni volta che si ottiene un valore restituito pari a 0 in WMI, è sufficiente ricordare che il comando è stato eseguito correttamente.

Enumeration

In mancanza degli altri due metodi, se si deve fare qualcosa a un gruppo di oggetti, è possibile enumerare l'intero oggetto e agire su ogni singolo oggetto. Per prima cosa devi trovare il metodo che useresti per fermare un singolo processo.

Get-Process |Get-Member -MemberType Method

Perfetto, sembra che possiamo usare il metodo Kill e poi pipe in ForEach-Object per ucciderli tutti.

Get-Process -Nome notepad |ForEach-Object -Process{ $ _. Kill()}

Qui abbiamo preso tutti gli oggetti di processo restituiti da Get-Process e li abbiamo passati al cmdlet ForEach-Object. Proprio come il cmdlet Where-Object, abbiamo rappresentato ogni oggetto nella pipeline con $ _ su cui siamo stati in grado di chiamare il metodo Kill() .Con tutto ciò che detto e fatto, l'enumerazione di una raccolta è molto più lenta dei metodi precedenti e dovrebbe essere utilizzata solo come ultimo risultato.

Riepilogo

Choice One

Get-Process -Nome notepad |Stop-Process

Choice Two

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Terminate

Choice Three

Get-Process -Nome notepad |ForEach-Object -Process{ $ _. Kill()}

Questo è tutto per questa volta gente, ci vediamo la prossima settimana per più divertimento con PowerShell.