powershell - создание сценария динамического принтера - структура вывода и команд - PullRequest
2 голосов
/ 25 апреля 2011

Я пытаюсь создать сценарий с использованием powershell, который можно использовать для создания списка:

  • сетевых принтеров, на которых в данный момент установлен пользователь
  • драйверов принтера, которые в данный момент установленына ПК пользователей

мне удалось придумать следующий скрипт.Я все еще очень плохо знаком с 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! Я просто хотел добавить, что функция "Удалить пробелы" не моя работа! Я нашел ее на другом сайте ивключил его в мой скрипт. Оригинал здесь

   $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 Ответ

1 голос
/ 25 апреля 2011

Я пытаюсь помочь вам только в первом разделе вашего скрипта, о принтерах.

Во-первых, почему вы перенаправляете принтеры в текстовые файлы?

## 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...