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可以同时执行多个调用,这将解决方法延迟。 –