【问题标题】:PowerShell change printer configuration from Administration tabPowerShell 从管理选项卡更改打印机配置
【发布时间】:2015-11-08 02:32:48
【问题描述】:

我能够使用 powershell 创建和安装打印机。现在我还需要自动化打印机配置,并且需要在“管理”选项卡中更改多个值。

我如何通过 powershell 做到这一点?我尝试了 Set-PrinterProperty,但我无法让它工作。

谢谢

【问题讨论】:

    标签: powershell printing automation printers


    【解决方案1】:

    我发现一种易于实现的方法是从当前的打印机配置开始,使用 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
        }
    
    }
    

    【讨论】:

    • 好的,我能够获得这些功能,但没有一个对应于管理选项卡。这是我得到的选项:pastebin.com/8NsSU2za
    • 不幸的是,并非所有东西都可以通过这种方式进行管理。帮助中记录了可能的情况。我没有办法测试,但看看 Get-PrinterProperty 和 Set-PrinterProperty 看看你想要的属性更改是否可用:technet.microsoft.com/en-us/library/hh918351(v=wps.630).aspx
    • 我知道...关于 Set-PrinterProperty 函数我如何知道属性名称?我怎样才能得到一个完整的清单?我尝试了盲名,但返回错误:(
    • 您可以为此使用 Get-PrinterProperty。尝试:get-printer * | %{get-printerproperty $_.name} 并查看 config:* 属性。这些是您可以使用 Set-PrinterProperty 设置的那些
    • 这些命令看起来很神奇 xD 谢谢我稍后再试 :)
    【解决方案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 指定。如果 f 和 r 均未指定且名称不匹配,则设置恢复失败。
    • i:如果保存的设置文件中的驱动程序与要恢复到的打印机的驱动程序不匹配,则恢复失败。
    • p:如果要恢复的文件中的端口名称与要恢复到的打印机的当前端口名称不匹配,则使用打印机的当前端口名称。
    • d:用于恢复打印机特定数据,例如打印机的硬件 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-30
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多