溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PowerShell管道和括號——PowerShell三分鐘(六)

發(fā)布時間:2020-07-18 04:22:14 來源:網(wǎng)絡(luò) 閱讀:3974 作者:Liuzw_37 欄目:建站服務(wù)器

本期主要介紹多個命令之間的銜接——管道

PowerShell通過管道把命令互相連接起來,通過傳輸?shù)谝粋€命令,將其作為第二個命令Cmdlet的輸入,使其聯(lián)合運行
應(yīng)用管道符可以極大的提高效率,原本需要多次執(zhí)行的命令只需一行即可完成


舉個栗子
現(xiàn)在需要查詢所有 zhangs 開頭的域賬號,并禁用
那么我們可以這樣運行

Get-ADUser -Filter {SamAccountName -like "zhangs*"} | Set-ADUser -Enabled $False


當(dāng)然,管道可以同時使用多個,假設(shè)你的賬號存在一個文本里,就可以這樣寫

Get-Content C:\1.txt | Get-ADUser -Filter {Enabled -eq $True} | Set-ADUser -Enabled $False


但管道并不是越多越好,太多的管道會降低執(zhí)行效率,這里還請大家要注意一下


從上面的例子可以看出,通過管道可以先查詢AD用戶,然后設(shè)置AD用戶



但如果是兩個不相關(guān)的數(shù)據(jù)這樣執(zhí)行,會有什么結(jié)果呢?

PowerShell管道和括號——PowerShell三分鐘(六)

PowerShell管道和括號——PowerShell三分鐘(六)

實時證明,無法成功執(zhí)行

PowerShell管道和括號——PowerShell三分鐘(六)


那么,PowerShell究竟是如何傳輸數(shù)據(jù)給管道的呢??

在下面的示例中,我們將第一條命令成為命令A(yù),這條命令會產(chǎn)生某些結(jié)果。第二條命令成為命令B,它會接收命令A(yù)產(chǎn)生的結(jié)果集,然后完成自己的工作

Get-Content C:\Computers.txt | Get-Service

當(dāng)運行Get-Content時,它會將文本文件中的計算機名稱放入管道中。之后PowerShell再決定如何將該數(shù)據(jù)傳遞給Get-Service命令。但PowerShell一次只能使用單個參數(shù)來接收傳入數(shù)據(jù)。

也就是說PowerShell必須決定由Get-Service的哪個參數(shù)來接收Get-Content產(chǎn)生的結(jié)果,這個決定稱為管道參數(shù)綁定。

PowerShell共有兩種方法進行管道參數(shù)綁定:

  • ByValue

當(dāng)使用ByValue這種方式實現(xiàn)管道參數(shù)綁定時,PowerShell會確認命令A(yù)產(chǎn)生的數(shù)據(jù)對象類型,然后查看命令B中哪個參數(shù)可以接受經(jīng)由管道傳來對象的類型。

PowerShell管道和括號——PowerShell三分鐘(六)


你會看到Get-Content命令產(chǎn)生的結(jié)果對象是String。通過查詢幫助,可以看到Get-Service中的確存在可以從ByValue管道中接收String類型數(shù)據(jù)的參數(shù)-Name。你可能已經(jīng)發(fā)現(xiàn)了一個問題:這不是我們需要的——我們的文本文件中的內(nèi)容,也就是String對象,指的是計算機名稱,并不是服務(wù)名稱,所以肯定無法執(zhí)行。


  • ByPropertyName

該方案同樣將命令A(yù)的輸出結(jié)果傳遞給命令B的參數(shù),但是ByPropertyName與ByValue稍有不同:命令B的多個參數(shù)可以被同時使用。
該功能是實現(xiàn)其實非常簡單:僅僅是尋找能夠匹配參數(shù)名稱的屬性名稱

PowerShell管道和括號——PowerShell三分鐘(六)



但如果命令A(yù)輸出的屬性和命令B的參數(shù)名稱不對齊時,將會變得比較困難。這時需要通過自定義屬性來解決

PowerShell管道和括號——PowerShell三分鐘(六)


有些時候,不管我們怎么嘗試,都無法處理管道的輸出結(jié)果。比如Get-WmiObject
Get-Content .\Computers.txt | Get-WmiObject –Class Win32_BIOS
該參數(shù)并不能接收來自管道的計算機名稱,那么我們?nèi)绾螌⑵渌麃碓吹臄?shù)據(jù)傳遞給該命令呢?


這時可以通過括號來優(yōu)先執(zhí)行括號內(nèi)的命令,然后將結(jié)果作為參數(shù)進行傳遞
Get-WmiObject –Class Win32_BIOS –ComputerName (Get-Content .\Computers.txt)



好啦,基本的管道和括號介紹完了,各位趕快把命令優(yōu)化起來,爭取在一行以內(nèi)執(zhí)行完畢


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI