Geek School: lavorare con le raccolte in PowerShell

Sommario:

Geek School: lavorare con le raccolte in PowerShell
Geek School: lavorare con le raccolte in PowerShell

Video: Geek School: lavorare con le raccolte in PowerShell

Video: Geek School: lavorare con le raccolte in PowerShell
Video: Microsoft Surface Pro 8: è ancora il miglior 2-in-1? - YouTube 2024, Aprile
Anonim
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.
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.

Assicurati di leggere gli articoli precedenti della serie:

  • Scopri come automatizzare Windows con PowerShell
  • Imparare a utilizzare i cmdlet in PowerShell
  • Apprendimento Come utilizzare gli oggetti in PowerShell
  • Apprendimento della formattazione, del filtro e del confronto in PowerShell
  • Impara a utilizzare i servizi remoti in PowerShell
  • Utilizzo di PowerShell per ottenere informazioni sul computer

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

Utilizzo dei cmdlet batch

All'inizio della serie, quando ti abbiamo presentato alla pipeline, ti abbiamo mostrato come puoi prendere gli oggetti che un cmdlet emette e passarli come input a un altro cmdlet usando qualcosa di simile a questo:

Get-Process -Name 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

Image
Image

Se guardi l'ultima riga di codice nella sezione della sintassi, puoi vedere che il parametro InputObject accetta un oggetto di tipo Process , e ogni volta che vedi un tipo seguito da due parentesi quadre come questo significa che il parametro accetta uno o più del tipo precedente. In questo caso, accetta uno o più oggetti processo. Tecnicamente, diremmo che il cmdlet InputObject accetta un processo schieramento. Ogni volta che si dispone di un cmdlet che supporta le operazioni batch in questo modo, utilizzarlo. Questa è la scelta numero uno.

Utilizzando WMI

Anche se WMI non è il miglior pezzo di tecnologia da spedire dal Microsoft HQ, arriva in secondo luogo nella lista di come lavorare con le collezioni di oggetti. Potremmo facilmente ottenere un elenco di processi in esecuzione dalla classe Win32_Process in questo modo:

Get-WmiObject –Class Win32_Process

Dal momento che la query WMI restituisce il proprio tipo di oggetto, sarà necessario cercare un metodo che possa arrestare il processo, quindi consente di collegarlo a Get Member.
Dal momento che la query WMI restituisce il proprio tipo di oggetto, sarà necessario cercare un metodo che possa arrestare il processo, quindi consente di collegarlo a 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 giusto. Per chiamare un metodo su un oggetto WMI, basta collegarlo a Invoke-WmiMethod e specificare il nome del metodo.
Sembra che la cosa più vicina da interrompere sia il metodo terminate, quindi deve essere quello giusto. 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.
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.

Enumerazione

In mancanza degli altri due metodi, se devi fare qualcosa a un gruppo di oggetti, puoi 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 canalizzare in ForEach-Object per ucciderli tutti.
Perfetto, sembra che possiamo usare il metodo Kill e poi canalizzare in ForEach-Object per ucciderli tutti.

Get-Process -Name 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.
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.

Sommario

Scelta Uno

Get-Process -Name notepad | Stop-Process

Scelta Due

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

Scelta tre

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

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

Consigliato: