Powershell invoke-command vs -computerName 效率比較

豆子一直以來都有一個認識誤區,一直認爲powershell遠程操作的時候,如果某個命令自帶了-computername的參數,那麼就用他好了,這個自帶的肯定效率比 我用invoke-command遠程調用強。今天無意翻了翻課本,才發現這個認識是錯誤的!我居然帶着這種錯誤的認識寫了1年的腳本~j_0041.gif


豆子實際驗證了一下,比如我查詢5個計算機最新的200條日誌記錄,下面兩條語句都能獲得類似的結果。

Get-Eventlog -ComputerName sydit01,sydav01,sydwsus,melfs01,melfs02 -LogName application -newest 200
 
invoke-command -ComputerName sydit01,sydav01,sydwsus,melfs01,melfs02 -ScriptBlock{get-eventlog -LogName application -newest 200}


我可以用measure-command來估算一下執行時間,看看區別果然很明顯。第一條命令使用自帶的-computerName 花了35秒,第二條命令花了11秒,幾乎是3倍多的區別


wKioL1bWdkiBGDSyAAAv7n0RubI560.png

wKioL1bWdlOwYUN_AAA3EncTsG8844.png


爲什麼會這樣呢?

簡單的說下區別,如果使用自帶的-computerName,所有的命令都是按照計算機的順序依次執行,類似foreach的效果,而invoke-command可以同時默認操作32臺計算機;


第二個重要的區別是前者沒有使用winrm服務,而是使用.net的某協議,而這些協議有可能被防火牆所屏蔽。


第三個重要區別是前者不會顯示pscomputername 的屬性,所有的結果出來你很難區分是從哪裏來的;而後者可以輕鬆區別數據來自哪臺計算機;


第四點,如果我在管道後面通過where-object進行過濾,前者會把所有結果一股腦傳回本機,然後過濾;而後者可以在scriptblock裏面進行過濾之後再傳回結果。這個很類似-filter 和 where-object的區別了。


綜上所述,一般情況下,使用invoke-commnad效率要高多了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章