簡體   English   中英

PowerShell從“管理”選項卡更改打印機配置

[英]PowerShell change printer configuration from Administration tab

我無法使用Powershell創建和安裝打印機。 現在,我還需要自動進行打印機配置,並需要在“管理”選項卡中更改多個值。

打印機設定

我如何通過Powershell做到這一點? 我嘗試了Set-PrinterProperty,但無法正常工作。

謝謝

我發現易於實現的一種方法是,從當前的打印機配置開始,使用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
    }

}

最好的方法是使用下面的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指定。 如果未指定f或r並且名稱不匹配,則恢復設置將失敗。
  • i:如果保存的設置文件中的驅動程序與要還原到的打印機的驅動程序不匹配,則還原失敗。
  • p:如果要從中還原文件的端口名與要還原到的打印機的當前端口名不匹配,則使用打印機的當前端口名。
  • d:用於還原打印機特定的數據,例如打印機的硬件ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM