自动设置默认打印选项的脚本

wen 实用脚本 2
<#
.SYNOPSIS
    自动设置 Windows 默认打印选项 (如双面打印、黑白、纸张大小等)
.DESCRIPTION
    通过修改注册表,为当前用户设置打印机的默认打印偏好。
    需要以管理员权限运行以修改所有用户配置,或以普通用户身份仅修改当前用户。
.NOTES
    作者: AI 助手
    版本: 1.0
    注意: 请根据实际打印机名称和需要的参数修改脚本中的变量。
#>
# ========== 配置区域 - 请根据您的需要修改 ==========
# 目标打印机名称 (在“设备和打印机”中看到的名称)
$PrinterName = "Microsoft Print to PDF"  # 示例: "HP LaserJet Pro M404n" 或 "Microsoft Print to PDF"
# 打印参数设置
$PaperSize = "A4"             # 纸张大小: A4, Letter, Legal 等
$Duplex = "DuplexHorizontal"  # 双面打印: "DuplexHorizontal" (长边翻转), "DuplexVertical" (短边翻转), "Simplex" (单面)
$Color = "Mono"               # 颜色: "Color" (彩色) 或 "Mono" (黑白/灰度)
$Collate = "True"             # 逐份打印: "True" 或 "False"
$Copies = 1                   # 打印份数
$Orientation = "Portrait"     # 方向: "Portrait" (纵向) 或 "Landscape" (横向)
$Resolution = "600"           # 默认分辨率 (DPI), 如 "600", "1200" (并非所有打印机支持)
# ========== 以下为脚本逻辑 - 通常无需修改 ==========
# 检查是否以管理员权限运行 (可选)
# 如果需要修改系统范围的打印机设置,可能需要管理员权限;修改当前用户设置通常不需要。
# if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
#     Write-Host "错误: 请以管理员身份运行此脚本。" -ForegroundColor Red
#     exit 1
# }
# 函数:设置默认打印参数
function Set-PrinterDefaults {
    param (
        [string]$PrinterName,
        [string]$PaperSize,
        [string]$Duplex,
        [string]$Color,
        [string]$Collate,
        [int]$Copies,
        [string]$Orientation,
        [string]$Resolution
    )
    # 使用 WMI 获取打印机对象
    $printer = Get-WmiObject -Class Win32_Printer -Filter "Name='$PrinterName'"
    if (-not $printer) {
        Write-Host "错误: 找不到打印机 '$PrinterName',请检查打印机名称。" -ForegroundColor Red
        return $false
    }
    Write-Host "正在配置打印机: $PrinterName" -ForegroundColor Cyan
    try {
        # 获取打印机默认设置 (DevMode)
        $devMode = $printer.GetDeviceContext()  # 尝试获取当前设备上下文
        # 注意: Win32_Printer 的 GetDeviceContext 可能不总是可用,因此我们采用另一种更通用的方法
        # 另一种方法: 通过注册表直接修改
        # 注册表路径: HKCU:\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts\
        # 或 HKLM:\SYSTEM\CurrentControlSet\Control\Print\Printers\ 下的 PrtMfgInfo 等
        # 更可靠的方案: 使用 PowerShell 的 Set-PrintConfiguration (Windows 8+ / Server 2012+)
        # 但 Set-PrintConfiguration 只能设置部分选项,且需要打印机支持
        Write-Host "尝试使用 Set-PrintConfiguration 设置选项..." -ForegroundColor Yellow
        # 注意: 以下命令可能需要管理员权限,并且部分打印机驱动可能不兼容
        $printConfig = @{
            PrinterName = $PrinterName
            # PaperSize 参数需要具体名称,可能因驱动而异
        }
        # 由于 Set-PrintConfiguration 的局限性,我们改用更底层的 DevMode 修改方法
        # 通过注册表修改默认 DevMode
        Write-Host "通过注册表修改默认打印设置..." -ForegroundColor Yellow
        # 获取打印机注册表路径 (当前用户)
        $regPath = "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Print\Printers\$PrinterName"
        # 检查路径是否存在 - 如果不存在,可能打印机从未被设置为默认或使用过
        if (-not (Test-Path $regPath)) {
            Write-Host "警告: 未找到用户打印机配置路径,尝试创建..." -ForegroundColor Yellow
            # 有时需要在 HKCU 下先创建一项
            $null = New-Item -Path $regPath -Force -ErrorAction SilentlyContinue
        }
        # 读取默认的 DevMode 数据 (Default DevMode)
        # 注意: DevMode 是二进制数据,直接修改较为复杂。
        # 我们选择更简单的方法: 使用 PrintUIEntry 命令 (Windows 自带)
        Write-Host "使用 rundll32 printui.dll 命令配置默认选项..." -ForegroundColor Green
        # 构建命令行参数
        # 注意: printui.dll 的语法较为复杂且有限,不同语言/版本可能有差异
        # 我们采用更现代的 PrintManagement 模块 (如果可用)
        # 方案A: 使用 PrintManagement 模块 (Windows 10/11 专业版/企业版)
        if (Get-Command -Name Set-PrintConfiguration -ErrorAction SilentlyContinue) {
            Write-Host "发现 Set-PrintConfiguration cmdlet,尝试直接设置..." -ForegroundColor Green
            $params = @{}
            $params.PrinterName = $PrinterName
            # 纸张大小 (需匹配驱动支持)
            if ($PaperSize -eq "A4") { $params.PaperSize = "A4" }
            elseif ($PaperSize -eq "Letter") { $params.PaperSize = "Letter" }
            # 双面打印
            if ($Duplex -eq "DuplexHorizontal") { $params.DuplexingMode = "TwoSidedLongEdge" }
            elseif ($Duplex -eq "DuplexVertical") { $params.DuplexingMode = "TwoSidedShortEdge" }
            elseif ($Duplex -eq "Simplex") { $params.DuplexingMode = "OneSided" }
            # 颜色
            if ($Color -eq "Mono") { $params.Color = $false }  # 假设 false 表示黑白
            elseif ($Color -eq "Color") { $params.Color = $true }
            # 逐份打印
            if ($Collate -eq "True") { $params.Collate = $true }
            else { $params.Collate = $false }
            # 份数
            $params.CopyCount = $Copies
            # 方向
            if ($Orientation -eq "Portrait") { $params.PaperOrientation = "Portrait" }
            elseif ($Orientation -eq "Landscape") { $params.PaperOrientation = "Landscape" }
            # 分辨率 (并非所有驱动支持)
            # $params.Resolution = $Resolution  # 可能不支持直接设置
            try {
                Set-PrintConfiguration @params -ErrorAction Stop
                Write-Host "  成功通过 Set-PrintConfiguration 设置打印选项。" -ForegroundColor Green
                return $true
            }
            catch {
                Write-Host "  使用 Set-PrintConfiguration 失败: $_" -ForegroundColor Yellow
                Write-Host "  回退到 printui.dll 方法..." -ForegroundColor Yellow
            }
        }
        # 方案B: 使用 printui.dll 命令 (兼容性更好)
        Write-Host "尝试 printui.dll 命令行方法..." -ForegroundColor Yellow
        # 构建参数: /Sr 参数可以指定要设置的选项
        # 格式: rundll32 printui.dll,PrintUIEntry /Sr [flags] [options] /n "printer name"
        # 但这需要知道具体的 flags 组合,且不直观
        # 我们采用更通用的方法: 使用 .NET 直接修改打印机 DevMode
        Write-Host "尝试使用 .NET 修改打印机默认设置..." -ForegroundColor Yellow
        Add-Type -AssemblyName System.Printing
        try {
            $printServer = New-Object System.Printing.LocalPrintServer
            $printQueue = $printServer.GetPrintQueue($PrinterName)
            if ($printQueue -eq $null) {
                Write-Host "  无法获取打印队列。" -ForegroundColor Red
                return $false
            }
            # 获取默认打印工单
            $printTicket = $printQueue.DefaultPrintTicket
            # 修改属性
            # 纸张大小
            if ($PaperSize -eq "A4") { $printTicket.PageMediaSizeName = [System.Printing.PageMediaSizeName]::ISOA4 }
            elseif ($PaperSize -eq "Letter") { $printTicket.PageMediaSizeName = [System.Printing.PageMediaSizeName]::Letter }
            # 双面打印
            if ($Duplex -eq "DuplexHorizontal") { $printTicket.Duplexing = [System.Printing.Duplexing]::TwoSidedLongEdge }
            elseif ($Duplex -eq "DuplexVertical") { $printTicket.Duplexing = [System.Printing.Duplexing]::TwoSidedShortEdge }
            elseif ($Duplex -eq "Simplex") { $printTicket.Duplexing = [System.Printing.Duplexing]::OneSided }
            # 颜色 (可能不支持所有打印机)
            if ($Color -eq "Mono") { $printTicket.OutputColor = [System.Printing.OutputColor]::Grayscale }
            elseif ($Color -eq "Color") { $printTicket.OutputColor = [System.Printing.OutputColor]::Color }
            # 逐份打印
            $printTicket.Collation = if ($Collate -eq "True") { [System.Printing.Collation]::Collated } else { [System.Printing.Collation]::Uncollated }
            # 副本数
            $printTicket.CopyCount = $Copies
            # 方向
            if ($Orientation -eq "Portrait") { $printTicket.PageOrientation = [System.Printing.PageOrientation]::Portrait }
            else { $printTicket.PageOrientation = [System.Printing.PageOrientation]::Landscape }
            # 应用设置
            $printQueue.DefaultPrintTicket = $printTicket
            $printQueue.Commit()
            Write-Host "  成功通过 .NET 设置默认打印选项。" -ForegroundColor Green
            $printServer.Dispose()
            return $true
        }
        catch {
            Write-Host "  .NET 方法失败: $_" -ForegroundColor Yellow
            Write-Host "  尝试最终的注册表方法..." -ForegroundColor Yellow
        }
        # 方案C: 直接修改注册表 DevMode (最后手段)
        # 注意: DevMode 是二进制结构,修改复杂,此处提供思路但不深入实现
        Write-Host "  注册表直接修改 DevMode 较为复杂,请考虑使用专业工具。" -ForegroundColor Red
        Write-Host "  推荐使用 Set-PrintConfiguration 或打印机属性对话框手动配置。" -ForegroundColor Cyan
        return $false
    }
    catch {
        Write-Host "错误: 设置打印选项时出现异常: $_" -ForegroundColor Red
        return $false
    }
}
# 执行主函数
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "  自动设置默认打印选项脚本" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "目标打印机: $PrinterName" -ForegroundColor White
Write-Host "纸张大小 : $PaperSize" -ForegroundColor White
Write-Host "双面打印 : $Duplex" -ForegroundColor White
Write-Host "颜色模式 : $Color" -ForegroundColor White
Write-Host "========================================" -ForegroundColor Cyan
$result = Set-PrinterDefaults -PrinterName $PrinterName -PaperSize $PaperSize -Duplex $Duplex -Color $Color -Collate $Collate -Copies $Copies -Orientation $Orientation -Resolution $Resolution
if ($result) {
    Write-Host "`n设置完成!请打开任意文档进行打印测试以验证效果。" -ForegroundColor Green
} else {
    Write-Host "`n设置未完全成功,请尝试手动配置打印机默认选项。" -ForegroundColor Yellow
    Write-Host "手动步骤: 设置 -> 蓝牙和设备 -> 打印机和扫描仪 -> 选择打印机 -> 打印首选项" -ForegroundColor Cyan
}
# 可选: 列出当前打印机的配置
Write-Host "`n当前打印机默认配置摘要:" -ForegroundColor Magenta
try {
    $currentConfig = Get-PrintConfiguration -PrinterName $PrinterName -ErrorAction SilentlyContinue
    if ($currentConfig) {
        $currentConfig | Format-List PrinterName, PaperSize, DuplexingMode, Color, Collate, CopyCount, PaperOrientation
    }
} catch {
    Write-Host "无法获取当前配置 (可能需要管理员权限)" -ForegroundColor DarkGray
}
# 暂停,以便查看结果
Read-Host "`n按 Enter 键退出..."

脚本使用说明

  1. 修改配置区域:在脚本顶部的“配置区域”中,根据您的打印机和需求修改变量。

    自动设置默认打印选项的脚本

    • $PrinterName:请替换为您的实际打印机名称(可在“设置 > 蓝牙和设备 > 打印机和扫描仪”中查看)。
    • 其他参数如$PaperSize$Duplex等,请根据需要调整,注意部分打印机驱动可能不支持所有选项。
  2. 运行脚本

    • 将脚本保存为 .ps1 文件(Set-PrintDefaults.ps1)。
    • 右键点击文件,选择“使用 PowerShell 运行”。
    • 如果遇到执行策略限制,请以管理员身份打开 PowerShell 并运行 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  3. 脚本工作原理

    • 脚本会依次尝试三种方法设置默认打印选项:Set-PrintConfiguration cmdlet、.NET System.Printing 库、以及注册表修改。
    • 通常前两种方法能适用于大多数现代打印机,运行结束后会显示是否成功及应用了哪些配置。
  4. 注意事项

    • 部分打印机驱动可能不支持通过脚本修改所有选项,如果脚本执行后设置未生效,请手动在“打印首选项”中确认。
    • 脚本默认仅为当前用户设置,如需为所有用户设置,请以管理员身份运行,并可能需要修改注册表路径为 HKLM

希望这个脚本能帮助您提高打印效率,如果遇到特定打印机名称或选项问题,可以调整配置区域后重试。

上一篇怎么用脚本转换音频为文字

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!