2015-11-08 43 views
1

我能夠使用PowerShell創建和安裝打印機。現在我還需要自動執行打印機配置,並需要在「管理」選項卡中更改多個值。從管理選項卡PowerShell更改打印機配置

Printer Settings

我怎樣才能做到這一點通過PowerShell的?我試過Set-PrinterProperty,但是我無法使它工作。

感謝

回答

2

的一種方式,我發現很容易實現,這是從當前的打印機配置開始,使用Get-PrinterConiguration,再看看xml和改變任何你需要,然後使用Set-PrinterProperty推升新的xml。

以下是我前一段時間創建的更新打印機托盤的功能。它應該(希望)讓你開始。要做到這一點

Function Set-MyDefaultPrinterTray { 
#Requires -module PrintManagement 
<# 
    .SYNOPSIS 
    Update Default Tray assignment of printer 

    .EXAMPLE 
    > Set-MyDefaultPrinterTray -ComputerName (Get-Content C:\temp\epicprinter\servers.txt) -PrintQueue ZZZ_Adil_Test03 -Tray 4 -Verbose 
    VERBOSE: Change tray to Tray4 on epswcdcqvm001 
    VERBOSE: Getting PrintConfiguration... 
    VERBOSE: epswcdcqvm001 : CurrentTray is psk:AutoSelect 
    VERBOSE: epswcdcqvm001 : New Tray ns0000:Tray4 
    VERBOSE: Performing the operation "Update Tray" on target "epswcdcqvm001". 
    VERBOSE: epswcdcqvm001 : Setting new tray assignment 
    VERBOSE: epswcdcqvm001 : Adding to success table 
    VERBOSE: Change tray to Tray4 on epswcdcqvm002 
    VERBOSE: Getting PrintConfiguration... 
    VERBOSE: epswcdcqvm002 : CurrentTray is psk:AutoSelect 
    VERBOSE: epswcdcqvm002 : New Tray ns0000:Tray4 
    VERBOSE: Performing the operation "Update Tray" on target "epswcdcqvm002". 
    VERBOSE: epswcdcqvm002 : Setting new tray assignment 
    VERBOSE: epswcdcqvm002 : Adding to success table 
    VERBOSE: Change tray to Tray4 on epswcdcqvm001 
    VERBOSE: Getting PrintConfiguration... 
    VERBOSE: epswcdcqvm001 : CurrentTray is ns0000:Tray4 
    VERBOSE: epswcdcqvm001 : New Tray ns0000:Tray4 
    VERBOSE: Performing the operation "Update Tray" on target "epswcdcqvm001". 
    VERBOSE: epswcdcqvm001 : Setting new tray assignment 

    Name       Value 
    ----       ----- 
    epswcdcqvm002     Succeed 
    epswcdcqvm001     Succeed 

    .EXAMPLE 
    D:\> Set-MyDefaultPrinterTray -PrintServer 'epswcdcqvm001','epswcdcqvm002' -PrintQueue ZZZ_Adil_Test03 -Tray Tray2 -Verbose 
    VERBOSE: Change tray to Tray2 on epswcdcqvm001 
    VERBOSE: Getting PrintConfiguration... 
    VERBOSE: epswcdcqvm001 : CurrentTray is psk:AutoSelect 
    VERBOSE: epswcdcqvm001 : New Tray ns0000:Tray2 
    VERBOSE: Performing the operation "Set-EpicDefaultPrinterTray" on target "epswcdcqvm001". 
    VERBOSE: epswcdcqvm001 : Setting new tray assignment 
    VERBOSE: Change tray to Tray2 on epswcdcqvm002 
    VERBOSE: Getting PrintConfiguration... 
    VERBOSE: epswcdcqvm002 : CurrentTray is psk:AutoSelect 
    VERBOSE: epswcdcqvm002 : New Tray ns0000:Tray2 
    VERBOSE: Performing the operation "Set-EpicDefaultPrinterTray" on target "epswcdcqvm002". 
    VERBOSE: epswcdcqvm002 : Setting new tray assignment 
#> 
    [CMDLETBINDING(SupportsShouldProcess)] 
    param(   
      [Parameter(Mandatory,ValueFromPipeline,Position=0)] 
      [Alias('PrintServer')]     
      [string[]]$ComputerName, 
      #[string[]]$PrintServer, 

      [Parameter(Mandatory,Position=1)] 
      [string]$PrintQueue, 

      [ValidateSet('1','2','3','4','Tray1','Tray2','Tray3','Tray4','AutoSelect','ManualFeed')] 
      $Tray='AutoSelect' 
     )  
    BEGIN 
    { 
      switch ($tray) 
      { 
      1 {$tray='Tray1';break} 
      2 {$tray='Tray2';break} 
      3 {$tray='Tray3';break} 
      4 {$tray='Tray4';break} 
      } 

      $result = @{} 
    } 
    PROCESS 
    { 

     Foreach ($ps in $ComputerName) 
     { 
      Write-Verbose "Change tray to $tray on $ps" 

      try 
      { 
       if (! (Test-Connection -ComputerName $ps -Count 1 -Quiet)) { 
        throw "Not Pingable"       
       } 

       Write-Verbose "Getting PrintConfiguration..." 
       $PrintConfiguration = Get-PrintConfiguration -ComputerName $ps -PrinterName $PrintQueue 
       $PrintTicketXML = [xml]$PrintConfiguration.PrintTicketXML 

       $currentTray = ($PrintTicketXML.PrintTicket.Feature).where({$_.name -eq 'psk:JobInputBin'}).option.name 
       Write-Verbose "$ps : CurrentTray is $currentTray " 


       if ($Tray -eq 'AutoSelect') {           
        $NewTray= "psk:$Tray" 
       } else { 
        $NewTray= "ns0000:$Tray" 
       } 

       Write-Verbose "$ps : New Tray $NewTray " 

       $UpdatedPrintTicketXML = $PrintConfiguration.PrintTicketXML -replace "$currentTray","$NewTray" 


       if ($PSCmdlet.ShouldProcess($ps,"Update Tray") ) { 
        Write-Verbose "$ps : Setting new tray assignment" 
        Set-PrintConfiguration -ComputerName $ps -printername $PrintQueue -PrintTicketXml $UpdatedPrintTicketXML 
        if (!$result.ContainsKey($ps)) { 
         Write-Verbose "$ps : Adding to success table" 
         $result.Add($ps,'Succeed') 
        } 
       } 

      } 
      catch 
      { 
        if (!$result.ContainsKey($ps)) { 
         Write-Verbose "$ps : Adding to fail table" 
         $result.Add($ps,'Fail') 
        } 

       Write-Error $error[0].exception 
      } 

     } 
    } 
    END 
    { 
      $result 
    } 

} 
+0

好吧,我能夠得到的功能,但沒有對應的管理選項卡。在這裏,我得到的選項:http://pastebin.com/8NsSU2za –

+0

不幸的是,並不是所有的東西都可以用來管理這種方式。幫助中記錄了可能的情況。我沒有辦法測試,但看看Get-PrinterProperty和Set-PrinterProperty,看看你想要的屬性是否有變化:https://technet.microsoft.com/en-us/library/hh918351 (v = wps.630).aspx –

+0

我知道...關於Set-PrinterProperty函數我怎麼知道屬性名稱?我怎樣才能得到一個完整的清單?我嘗試了盲目的名字,但是錯誤返回了:( –

2

最好的方法是使用下面的Windows工具,它應該,但當然不能保證,用「管理選項卡」工作。

這個工具的工作原理是,你首先設置打印機你想要的設置方式(配置相應的管理選項卡),並設置有這樣的命令導出到文件(在CMD或PowerShell中):

RUNDLL32 PRINTUI.DLL,PrintUIEntry /Ss /n "PRINTER_NAME" /a "C:\printerSettings.dat" g d u 

在「PRINTER_NAME」您輸入您想要的打印機名稱(帶引號),並在「C:...」,其中設置文件要保存的位置。在這裏結束的參數不一定,與你指定什麼得到保存到文件,沒有任何參數一切都得到保存,這可能是最好的...

現在,您的設置保存在一個文件,你會然後用該文件具有相同的驅動程序恢復對其他打印機設置像這樣的東西:

RUNDLL32 PRINTUI.DLL,PrintUIEntry /Sr /n "PRINTER_NAME" /a "C:\printerSettings.dat" g d u p i r 

,你可能會注意到,用於保存命令「/ SS」和差值「/ SR」在最後恢復和不同的參數。這裏有一點棘手的事情要注意 - 如果你用管理權限運行這個代碼,上面的代碼應該可以正常工作,否則你會得到一個錯誤。這裏的問題是「g」參數,因爲它試圖改變/恢復打印機的默認設置,而不僅僅是當前用戶的設置。用「u」恢復當前用戶的設置。所以你可能需要刪除「g」參數。

其他參數的鏈接描述,更重要的,我會複製到這裏(這是恢復 - 「/ SR」命令):

  • R:如果打印機名稱存儲在文件中與正在恢復的打印機的名稱不同,請使用當前的打印機名稱。這不能用f來指定。如果沒有指定r和f並且名稱不匹配,則恢復設置失敗。
  • f:如果存儲在文件中的打印機名稱與要恢復的打印機的名稱不同,則使用文件中的打印機名稱。這不能用r來指定。如果既沒有指定也沒有指定r並且名稱不匹配,則恢復設置失敗。
  • i:如果保存的設置文件中的驅動程序與要恢復到的打印機的驅動程序不匹配,則恢復失敗。
  • p:如果要恢復的文件中的端口名稱與要恢復的打印機的當前端口名稱不匹配,則使用打印機的當前端口名稱。
  • d:用於恢復打印機的特定數據,例如打印機的硬件ID。