Homepage » come » Geek School che lavora con le raccolte in PowerShell

    Geek School che lavora con le raccolte in PowerShell

    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
    • Imparare la formattazione, il filtraggio e il 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 -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 osservi 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 di 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 spedito 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.

    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 semplicemente inserirlo in 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.

    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.

    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.

    Sommario

    Scelta Uno

    Get-Process -Nome notepad | Stop-Process

    Scelta due

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

    Scelta tre

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

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