Skip to main content

極客學校:在PowerShell中使用集合

極客學校:在PowerShell中使用集合

Geoffrey Carr

由於PowerShell基於.Net Framework並且包含了各種其他技術,如WMI和CIM,因此總有不止一種方法可以實現同樣的功能。快來加入我們這篇簡短的帖子,我們將學習如何選擇最佳方法來完成我們的任務。

請務必閱讀本系列之前的文章:

  • 了解如何使用PowerShell自動化Windows
  • 學習在PowerShell中使用Cmdlet
  • 學習如何在PowerShell中使用對象
  • 在PowerShell中學習格式,過濾和比較
  • 學習在PowerShell中使用遠程處理
  • 使用PowerShell獲取計算機信息

並且整個星期都要繼續關注本系列的其餘部分。

使用批量Cmdlet

在本系列的前面部分,當我們向您介紹管道時,我們向您展示瞭如何使用以下內容將一個cmdlet輸出的對像作為輸入傳遞給另一個cmdlet:

Get-Process -Name notepad | Stop-Process

這將以名稱“notepad”終止任何進程。但是你可能想知道PowerShell如何能夠用一個命令殺死每個記事本實例。答案在Stop-Process cmdlet的幫助下。

help Stop-Process –Full

如果查看語法部分中的最後一行代碼,可以看到InputObject參數接受Process []類型的對象,並且每當看到類型後跟兩個方括號時,就意味著該參數接受 一個或多個 前一種類型。在這種情況下,它接受一個或多個過程對象。從技術上講,我們會說InputObject cmdlet接受一個進程 排列。每當您擁有以這種方式支持批處理操作的cmdlet時,請使用它。這是第一選擇。

使用WMI

雖然WMI不是從Microsoft HQ發布的最好的技術,但它在如何處理對象集合的列表中排在第二位。我們可以很容易地從Win32_Process類中獲取正在運行的進程列表,如下所示:

Get-WmiObject –Class Win32_Process

由於WMI查詢返回其自己的對像類型,因此您需要查找可以停止該進程的方法,因此請將其傳遞給Get-Member。

Get-WmiObject –Class Win32_Process | Get-Member

看起來最接近的東西是terminate方法,所以必須是那個。要在WMI對像上調用方法,只需將其傳遞給Invoke-WmiMethod並指定方法的名稱。

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

太好了,這就是訣竅。每當WMI中的ReturnValue為0時,只需記住命令執行成功。

列舉

如果必須對一堆對象執行某些操作,則可以枚舉整個對象並對每個單獨的對象執行操作。首先,您必須找到用於停止單個進程的方法。

Get-Process | Get-Member -MemberType Method

完美,看起來我們可以使用Kill方法,然後通過管道輸入ForEach-Object來殺死它們。

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

這裡我們獲取了Get-Process返回的所有進程對象,並將它們傳遞給ForEach-Object cmdlet。與Where-Object cmdlet非常相似,我們用$ _表示管道中的每個對象,我們可以在其上調用Kill()方法。完成所有這些操作後,枚舉集合比上述方法慢得多,並且只能用作最後的結果。

摘要

選擇一

Get-Process -Name notepad | Stop-Process

選擇二

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

選擇三

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

對於這段時間的人們來說,下週見到你,獲得更多PowerShell的樂趣。

Link
Plus
Send
Send
Pin