0

我正在嘗試編寫一個簡短的腳本,它將獲取域中所有計算機的列表,然後在它們上運行Get-Printer以獲取所有已安裝打印機的列表在每臺機器上。Powershell 4管道與Get-Printer的交互

要獲取該域中計算機,我想用「NET VIEW」列表中,所以我嘗試

net view | ForEach-Object {Get-Printer -ComputerName $_} 

但是,這並不工作。相反,我只是在網絡視圖中爲每臺PC獲取一行「假脫機服務無法訪問」。

手動輸入pc名稱到「Get-Printer」工作完美,我實際上編寫了一個工作腳本,在文本中搜索PC名稱後,將net view的結果輸出到.txt文件,然後讀取每行從文本文件中依次輸入到「Get-Printer」中。但是我希望能夠擴展這些代碼來集中管理打印機,所以我需要從我認爲可能的一條線上完成這項工作。

任何人都可以解釋我在這裏失蹤? ForEach如何在Powershell 4中實際工作?

以下是寫入一個文件,然後讀取它在我的工作代碼:

$PCs = net view /all | Select-String "\\" 

$a = ForEach ($Line in $PCs) 

{ $Line -Replace(" ","") 

} 

$a | Out-file -FilePath C:\Users\esmith\Desktop\test.txt -Encoding ascii 

Get-content C:\Users\esmith\Desktop\test.txt | ForEach-Object {Get-Printer -cn $_} | Out-file -FilePath C:\Users\esmith\Desktop\output.txt 

回答

1

net view是一個DOS命令行,它返回文本輸出。 PowerShell管道工作在對象而不是文本上,所以在這種情況下不能很好地結合。 (技術上說:字符串也是對象,但不是您期望的那種對象)。

您可以使用本機PowerShell cmdlet Get-AdComputer獲取作爲PowerShell對象的加入域的計算機的列表,然後將其提供給管道。

像這樣的東西應該工作:

Get-AdComputer -Filter * | ForEach-Object { Get-Printer -ComputerName $_.Name } 

The Get-Printer cmdlet does except pipeline input directly,所以這應該工作,以及(而不需要明確的foreach對象):

Get-AdComputer -Filter * | Get-Printer 
+0

稀釋,使一個很大的意義並解釋了爲什麼我的解決方法是有效的。然而,我有一個新問題。看起來,運行你的代碼是成功的,直到我沒有運行打印機假脫機程序服務而打到機器上。然後它無限期地掛起。有什麼方法可以爲該查詢添加超時並轉到列表中的下一臺電腦?我的鍛鍊代碼中沒有這個問題,因爲Get-AdComputer返回的設備列表比net view包括很多沒有運行假脫機程序服務的設備列表要多得多。 – evansmtihc

+0

Get-Printer似乎不支持超時參數。我期望它有合理的超時值內置。你確定它永遠不會返回,或只是需要(太)長?如果您使用我的第二個示例,則Get-Printer可以同時執行多個調用,這將解決方法延遲。 –