powershell - 创建动态打印机脚本 - 输出和命令结构

时间:2011-04-25 01:11:22

标签: powershell printing

我正在尝试使用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 “的开头,但不会显示在最后。

我知道这段代码可能非常糟糕,但我希望我能在这里找到一些可以使用的东西。我的主要目标是拥有一些动态的东西,我可以对任何计算机运行并让它清理打印机和打印机驱动程序。我将与我们的常规批处理文件一起运行它。这就是我将控制'假脱机'服务的地方。

非常感谢任何帮助或指示!

干杯

=====================编辑部分以包含建议的更改! 我只是想补充说“删除空间”这个功能不是我的工作! 我在另一个网站上找到它并将其合并到我的脚本中。 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

我相信这会奏效......无论如何。我将做一些测试,我会报告回来,并确保将其标记为已回答!

抓取文件外修复..它不起作用:( 仍然需要做额外的测试

谢谢你!

1 个答案:

答案 0 :(得分:1)

我正在尝试帮助您完成脚本的第一部分,关于打印机。

首先,为什么要将打印机重定向到文本文件?

## Get installed printers and create template command
$printers=get-WmiObject Win32_printer -Property Name | where { $_.Name -like "\\printserver1\*" -or $_.Name -like "\\printserver2\*" }

有了这个,你应该已经拥有了所有的打印机。 其次,使用反引号转义双引号。 第三,尝试使用write-output代替write-host

foreach ( $printer in $printers )
 {
   write-output "RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n `"$printer.name`""
 } 

如果它还不起作用,请invoke-expression out-null附加到管道:

foreach ( $printer in $printers )
 {
   write-output "RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n `"$printer.name`"" | invoke-expression | out-null
 } 

您也可以尝试使用invoke-item