【发布时间】:2011-04-25 01:11:22
【问题描述】:
我正在尝试使用 powershell 创建一个脚本,我可以用它来列出:
- 用户当前已安装的网络打印机
- 当前安装在用户 PC 上的打印机驱动程序
我设法想出了以下脚本。我对 powershell 还是很陌生,我知道它不是最漂亮的,但它在某种程度上可以工作。
$username=[Environment]::UserName
$machinename=[Environment]::MachineName
## Get installed printers and create template command
$printers=get-WmiObject Win32_printer -Property Name | where { $_.Name -like "\\printserver1\*" -or $_.Name -like "\\printserver2\*" }
$printers2=$printers | select-object Name
$printers2 > C:\testdir\"$username"PRINTERS.txt
$printers3=get-content C:\testdir\"$username"PRINTERS.txt | select-string -pattern "\\"
foreach ( $y in $printers3 )
{
write-host RUNDLL32 PRINTUI.DLL','PrintUIEntry /dn /n'"'$y
}
## Get drivers and create template command
$printerdrivers=get-wmiobject -class Win32_PrinterDriver -Property Name
$printerdrivers2=$printerdrivers -split('=') #| select-string 'Name'
$printerdrivers3=$printerdrivers2 | select-string 'HP'
foreach ( $i in $printerdrivers3 )
{
$removeprinter=$i -split (',') | select-string 'HP'
#write-host $removeprinter
write-host rundll32 printui.dll','PrintUIEntry /dd /c\\$machinename /m $removeprinter'"' /h "x64" /v "Type 3 - User Mode"
}
上面的代码产生以下输出:
RUNDLL32 PRINTUI.DLL,PrintUIEntry /dn /n"\\printserver1\ACC_PRINT_HP9040UPS
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.1)" /h x64 /v Type 3 - User Mode
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.2)" /h x64 /v Type 3 - User Mode
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Designjet T770 24in HPGL2" /h x64 /v Type 3 - User Mode
我遇到问题的地方有两个。
首先,我是否可以在同一个脚本中运行这些命令而不将它们输出到文本文件并将它们作为批处理文件运行?当我尝试运行模板命令时,我不断收到错误消息,指出打印机不存在。不幸的是,我不知道 powershell 是如何实际制定命令的。
其次,对于已安装的打印机部分,当我执行 write-host 命令时,由于某种原因,我无法在打印机名称周围加上引号。我可以让它显示在打印机名称 ""\printerserver1\ACC_PRINT_HP9040UPS" 的开头,但不是在结尾。
我知道这段代码可能真的很糟糕,但我希望这里有一些我可以使用的东西。我的主要目标是拥有一些动态的东西,我可以在任何计算机上运行它并让它清理打印机和打印机驱动程序。我将与我们的常规批处理文件一起运行它。这就是我将控制“后台处理程序”服务的地方。
任何帮助或指导将不胜感激!
干杯
===================== 编辑部分以包含 empo 建议的更改! 我只是想补充一点,“Remove-Spaces”功能不是我的工作! 我在另一个网站上找到它并将其合并到我的脚本中。 Original is here
$username=[Environment]::UserName
$machinename=[Environment]::MachineName
## this function removes all the blank spaces I had
Function Remove-Spaces {
param($target)
begin {
filter Do-RemoveSpaces { $_ -replace "\s *", "" }
}
process { if($_) { $_ | Do-RemoveSpaces } }
end { if($target) {$target | Do-RemoveSpaces} }
}
$printers=get-WmiObject Win32_printer -Property Name | where { $_.Name -like "\\printerserver1\*" -or $_.Name -like "\\printerserver2\*" }
$printers2=$printers | select-object Name | select-string -pattern "\\"
$printers2 > C:\testdir\"$username"PRINTERS.txt
$printers3=get-content C:\testdir\"$username"PRINTERS.txt | select-string -pattern "\\"
foreach ( $y in Remove-Spaces $printers3 )
{
write-output "RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n`"$y`"" | out-file *blah*
}
$printerdrivers=get-wmiobject -class Win32_PrinterDriver -Property Name
$printerdrivers2=$printerdrivers -split('=') #| select-string 'Name'
$printerdrivers3=$printerdrivers2 | select-string 'HP'
foreach ( $i in $printerdrivers3 )
{
$removeprinter=$i -split (',') | select-string 'HP'
#write-host $removeprinter
write-output "rundll32 printui.dll, PrintUIEntry /dd /c\\$machinename /m $removeprinter`"` /h x64 /v `"Type 3 - User Mode`"" | out-file *blah*
}
现在的输出如下所示:
RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n"\\printerserver1\ACC_PRINT_HP9040UPS"
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.1)" /h x64 /v Type 3 - User Mode
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.2)" /h x64 /v Type 3 - User Mode
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Designjet T770 24in HPGL2" /h x64 /v Type 3 - User Mode
我相信这会奏效......无论如何希望。我要做一些测试,我会报告并确保将其标记为已回答!
从头文件修复..它不起作用:( 还需要做额外的测试
谢谢!
【问题讨论】:
标签: powershell printing