您好,登錄后才能下訂單哦!
本期主要介紹多個命令之間的銜接——管道
PowerShell通過管道把命令互相連接起來,通過傳輸第一個命令,將其作為第二個命令Cmdlet的輸入,使其聯合運行
應用管道符可以極大的提高效率,原本需要多次執行的命令只需一行即可完成
舉個栗子
現在需要查詢所有 zhangs 開頭的域賬號,并禁用
那么我們可以這樣運行
Get-ADUser -Filter {SamAccountName -like "zhangs*"} | Set-ADUser -Enabled $False
當然,管道可以同時使用多個,假設你的賬號存在一個文本里,就可以這樣寫
Get-Content C:\1.txt | Get-ADUser -Filter {Enabled -eq $True} | Set-ADUser -Enabled $False
但管道并不是越多越好,太多的管道會降低執行效率,這里還請大家要注意一下
從上面的例子可以看出,通過管道可以先查詢AD用戶,然后設置AD用戶
但如果是兩個不相關的數據這樣執行,會有什么結果呢?
實時證明,無法成功執行
那么,PowerShell究竟是如何傳輸數據給管道的呢??
在下面的示例中,我們將第一條命令成為命令A,這條命令會產生某些結果。第二條命令成為命令B,它會接收命令A產生的結果集,然后完成自己的工作
Get-Content C:\Computers.txt | Get-Service
當運行Get-Content時,它會將文本文件中的計算機名稱放入管道中。之后PowerShell再決定如何將該數據傳遞給Get-Service命令。但PowerShell一次只能使用單個參數來接收傳入數據。
也就是說PowerShell必須決定由Get-Service的哪個參數來接收Get-Content產生的結果,這個決定稱為管道參數綁定。
PowerShell共有兩種方法進行管道參數綁定:
ByValue
當使用ByValue這種方式實現管道參數綁定時,PowerShell會確認命令A產生的數據對象類型,然后查看命令B中哪個參數可以接受經由管道傳來對象的類型。
你會看到Get-Content命令產生的結果對象是String。通過查詢幫助,可以看到Get-Service中的確存在可以從ByValue管道中接收String類型數據的參數-Name。你可能已經發現了一個問題:這不是我們需要的——我們的文本文件中的內容,也就是String對象,指的是計算機名稱,并不是服務名稱,所以肯定無法執行。
ByPropertyName
該方案同樣將命令A的輸出結果傳遞給命令B的參數,但是ByPropertyName與ByValue稍有不同:命令B的多個參數可以被同時使用。
該功能是實現其實非常簡單:僅僅是尋找能夠匹配參數名稱的屬性名稱
但如果命令A輸出的屬性和命令B的參數名稱不對齊時,將會變得比較困難。這時需要通過自定義屬性來解決
有些時候,不管我們怎么嘗試,都無法處理管道的輸出結果。比如Get-WmiObject
Get-Content .\Computers.txt | Get-WmiObject –Class Win32_BIOS
該參數并不能接收來自管道的計算機名稱,那么我們如何將其他來源的數據傳遞給該命令呢?
這時可以通過括號來優先執行括號內的命令,然后將結果作為參數進行傳遞
Get-WmiObject –Class Win32_BIOS –ComputerName (Get-Content .\Computers.txt)
好啦,基本的管道和括號介紹完了,各位趕快把命令優化起來,爭取在一行以內執行完畢
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。