Love0912 发表于 2024-10-17 08:14

PDF打印无法实现问题 批处理编码故障求助

本帖最后由 Love0912 于 2024-10-17 16:58 编辑

先看代码:
@echo off
setlocal enabledelayedexpansion
set "acroFound=0"

:: 遍历所有磁盘
echo 程序初始化中,查询您是否已安装PDF阅读软件。。。。。
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
    if exist %%d:\ (
      :: 检查每个磁盘的根目录及其子目录中是否存在AcroRd32.exe
      dir /b /s %%d:\AcroRd32.exe >nul 2>&1
      if !errorlevel! equ 0 (
            set "acroFound=1"
            for /f "delims=" %%i in ('dir /b /s %%d:\AcroRd32.exe') do (
                set "cx=%%i"
                goto :jx :: 找到了就结束循环
            )
      )
    )
)
:xz
cls
echo 你当前电脑未安装AcroRd PDF阅读器
echo.
echo 1进行下载,并关闭此脚本            2   直接关闭当前脚本   
echo.
:cho
set choice=
set /p choice=          请输入对应的按回车:
IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%
if /i "%choice%"=="1" goto wz
if /i "%choice%"=="2" goto end
echo 选择无效,请重新输入
echo.
goto cho
:wz
cls
start "" "https://zhaol.lanzoui.com/i1yhNf0uzje"
exit
rem 通过拖拽或输入文件名指定路径
:jx
cls
echo.   
echo                              二虎电脑 PDF打印管理器
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo.┋                                                                        
echo ┋   1、本程序用于快速批量打印PDF文件
echo ┋   2、本程序默认使用指定的PDF阅读器(Adobe Reader)并使用默认的打印机 ┋
echo.┋   3、本程序完全免费,旨在让您能快速完成繁琐的任务,解放双手
echo.┋   4、如发现BUG可联系作者进行反馈。
echo.┋   5、软件不设置版权限制,可以随意使用,但是不允许拿去卖钱!!                                                                  
echo.┋                                       
echo ┋                              作者:二虎电脑 同V
echo.╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
set "folder=%~1"
for /f "delims=" %%i in ('powershell -command "(Get-WmiObject -Class Win32_Printer | Where-Object { $_.Default -eq $true }).Name"') do set printer=%%i
if "%folder%"=="" set /p folder="请输入包含PDF文件的文件夹路径(支持直接将文件夹拖拽到本脚本)并按回车确认: "
rem 本脚本加密部分,需要输入密码才能继续使用本程序进行打印
setlocal enabledelayedexpansion
set InputPrompt=请输入密钥以继续:
set CorrectKeyMsg=密钥正确,继续执行...
set WrongKeyMsg=密钥错误,请重新输入或按X键退出...
set RetryPrompt=是否重新输入(Y/N)?:
set InvalidInputMsg=无效输入,请重新选择...

:PasswordLoop
set /p UserKey=!InputPrompt!
if "%UserKey%"=="52pj" (
    echo !CorrectKeyMsg!
    goto start
) else (
    echo !WrongKeyMsg!
    set /p Choice=!RetryPrompt!
    if /i "%Choice%"=="Y" goto PasswordLoop
    if /i "%Choice%"=="X" goto end
    echo !InvalidInputMsg!
    goto PasswordLoop
)
rem 指定完毕执行以下命令

:end
exit
rem 打印执行操作部分
:start
ECHO 请输入您要打印的份数(0-9,最大支持数字为9)
set cs=
set /p cs=          请输入对应的按回车:
IF NOT "%cs%"=="" SET cs=%cs:~0,1%
for /L %%i in (1,1,%cs%) do (
echo 正在执行打印操作中。。。
for %%f in ("%folder%*.pdf") do (
    echo 正在打印 %%f ...
    "%CX%" /t "%%f" "%printer%"
)
echo 第 %%i 次打印操作完成。
)
rem 执行完毕,反馈信息
echo.
echo 所有PDF文件打印完毕,摁任意键退出此脚本。
pause
先说下的我的编码思路:
首先检查是否安装有Adobe Reader PDF阅读器,如果有,转调JX标签,否则转调WZ标签进行下载提醒操作;因为有的PDF用的是绿化版本的不走注册表啥的,所以我这里用的是遍寻磁盘的方法,这样更精准,如果找到了则将路径保存到CX中,为打印做准备。
然后弹出简单的介绍窗口,让用户加载待打印的PDF文件夹,可以手动输入也可以采取拖拽的方式,将路径保存到FOLDER变量中。
然后是密码验证,输入正确的密码(52pj)即可进行下一步打印操作
最后就是打印部分,先输入需要打印的份数,将数据保存到变量CS中,然后执行打印操作。
语言环境:
批处理,BAT格式,ANSI编码
下面是问题:
现在遇到的问题是,除了打印功能外,其他的功能都已经成功实现落地了,但是看代码来说,我也没看出来哪里有问题,求助各位大佬,给瞅瞅怎么搞。
要求:
自己先测试一下,确定能落地了在回答,当然如果有思路也是极好的。然后给完代码后最好附带简单的说明,毕竟纯代码的话,有时候不好理解你的思路。。。
先感谢各位大佬的支援{:301_1003:}
-----------------------------------------------------
这个问题我自己攻克了,下面贴出来代码大家一起研究下看有啥不足的地方没有~
@echo off
setlocal enabledelayedexpansion
set "acroFound=0"

:: 遍历所有磁盘
echo 程序初始化中,查询您是否已安装PDF阅读软件。。。。。
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
if exist %%d:\ (
:: 检查每个磁盘的根目录及其子目录中是否存在foxit.exe
dir /b /s %%d:\foxit.exe >nul 2>&1
if !errorlevel! equ 0 (
set "acroFound=1"
for /f "delims=" %%i in ('dir /b /s %%d:\foxit.exe') do (
set CX="%%i"
title !CX!
echo 找到了程序:!CX!
::上面输出文件路径的时候需要带有引号,不然路径如果有空格就异常。
goto :jx :: 找到了就结束循环
)
)
)
)
:xz
cls
echo 你当前电脑未安装foxit PDF阅读器
echo.
echo 1进行下载,并关闭此脚本            2   直接关闭当前脚本
echo.
:cho
set choice=
set /p choice=          请输入对应的按回车:
IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%
if /i "%choice%"=="1" goto wz
if /i "%choice%"=="2" goto end
echo 选择无效,请重新输入
echo.
goto cho
:wz
cls
start "" "https://wwpe.lanzoue.com/irMcW2crgppi"
exit
rem 通过拖拽或输入文件名指定路径
:jx
cls
echo.
echo                              二虎电脑 PDF打印管理器
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo.┋
echo ┋   1、本程序用于快速批量打印PDF文件
echo ┋   2、本程序默认使用指定的PDF阅读器(Foxit)并使用默认的打印机 ┋
echo.┋   3、本程序完全免费,旨在让您能快速完成繁琐的任务,解放双手
echo.┋   4、如发现BUG可联系作者进行反馈。
echo.┋   5、软件不设置版权限制,可以随意使用,但是不允许拿去卖钱!!
echo.┋   6、请勿修改阅读器的名字,即PDF阅读器的名字必须是Foxit,否则会报错
echo.┋
echo ┋                              作者:二虎电脑 同V
echo.╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
set "folder=%~1"
for /f "delims=" %%i in ('powershell -command "(Get-WmiObject -Class Win32_Printer -Filter 'Default = True').Name"') do set printer=%%i

if "%folder%"=="" set /p folder="请输入包含PDF文件的文件夹路径(支持直接将文件夹拖拽到本脚本)并按回车确认: "
rem 本脚本加密部分,需要输入密码才能继续使用本程序进行打印
set InputPrompt=请输入密钥以继续:
set CorrectKeyMsg=密钥正确,继续执行...
set WrongKeyMsg=密钥错误,请重新输入或按X键退出...
set RetryPrompt=是否重新输入(Y/N)?:
set InvalidInputMsg=无效输入,请重新选择...
:PasswordLoop
set /p UserKey=!InputPrompt!
if "%UserKey%"=="52pj" (
echo !CorrectKeyMsg!
goto start
) else (
echo !WrongKeyMsg!
set /p Choice=!RetryPrompt!
if /i "%Choice%"=="Y" goto PasswordLoop
if /i "%Choice%"=="X" goto end
echo !InvalidInputMsg!
)
goto passwordloop
:end
exit
rem 打印执行操作部分
:start
ECHO 请输入您要打印的份数(0-9,最大支持数字为9)
set cs=
set /p cs=          请输入对应的按回车:
IF NOT "%cs%"=="" SET cs=%cs:~0,1%
for /L %%i in (1,1,%cs%) do (
echo 正在执行打印操作中。。。
for /R "%folder%" %%i in (*.pdf) do (
echo 正在打印 %%i ...
%CX% /t "%%i" "%printer%"
)

echo 第 %%i 次打印操作完成。
)
rem 执行完毕,反馈信息
echo.
echo 所有PDF文件打印完毕,摁任意键退出此脚本。
pause
taskkill /IM foxit.EXE /F

Monitor 发表于 2024-10-17 08:14

Love0912 发表于 2024-10-17 17:00
感谢大佬的志愿,这个问题终于搞定落地了,最后一个额外问题,就是为啥你贴的代码都是MD的正常背景,而我 ...

代码用的不是MD里面加入的,在MD右边有个<>,这个就是“添加代码文字”功能,在这里放入代码

jorlaying 发表于 2024-10-17 08:35

@echo off
REM 指定要打印的文件路径
set "FILE_PATH=C:\path\to\your\file.txt"

REM 指定打印机名称(可选,如果系统默认打印机设置正确,可以省略)
set "PRINTER_NAME=YourPrinterName"

REM 检查文件是否存在
if not exist "%FILE_PATH%" (
    echo 文件不存在: %FILE_PATH%
    exit /b 1
)

REM 打印文件
if defined PRINTER_NAME (
    copy /D "%FILE_PATH%" PRN:%PRINTER_NAME%
) else (
    copy /D "%FILE_PATH%" PRN:
)

echo 文件已发送到打印机。
pause

Monitor 发表于 2024-10-17 09:05

for /f "delims=" %%i in ('powershell -command "(Get-WmiObject -Class Win32Printer | Where-Object { $.Default -eq $true }).Name"') do set printer=%%i

应该是这里有问题

powershell -command "Get-WmiObject -Class Win32_Printer"
这段代码会在PowerShell中执行,获取当前计算机上所有打印机的信息。如果你想要获取特定的打印机信息,可以通过过滤属性来实现。例如,如果你想要获取名为"HP Printer"的打印机信息,可以使用以下代码:

powershell -command "Get-WmiObject -Class Win32_Printer | Where-Object { $_.Name -eq 'HP Printer' }"
请注意,Get-WmiObject 是一个较为旧的PowerShell cmdlet,在较新的系统中可能会被推荐使用的 Get-CimInstance 替代。如果你的环境支持 Get-CimInstance,你可以使用以下命令来获取打印机信息:

powershell -command "Get-CimInstance -ClassName Win32_Printer"
或者针对特定打印机的信息:

powershell -command "Get-CimInstance -ClassName Win32_Printer | Where-Object { $_.Name -eq 'HP Printer' }"
请确保你的PowerShell版本支持这些命令。

Love0912 发表于 2024-10-17 10:12

Monitor 发表于 2024-10-17 09:05
应该是这里有问题

powershell -command "Get-WmiObject -Class Win32_Printer"


没这么复杂的想法,我的想法是检索到并调用默认打印机进行打印输出即可。

Love0912 发表于 2024-10-17 10:16

jorlaying 发表于 2024-10-17 08:35
@echo off
REM 指定要打印的文件路径
set "FILE_PATH=C:\path\to\your\file. ...

你这个适用于打印文本或者图像,这两种都支持系统自带的命令进行驱动,但是打印PDF的时候并不适用,或者说如果应用到PDF文件上,无法落地进行打印。。。

NoWshun 发表于 2024-10-17 10:20

目前发现两个问题,第一:默认打印机找不到,55行查找不到默认打印机,修改成:for /f "delims=" %%i in ('powershell -command "$(Get-WmiObject -Class Win32_Printer | Where-Object { $_.Default -eq $true }).Name"') do set printer=%%i
第二:打印文件目录错误,90行少了斜杠,修改成:for %%f in ("%folder%\*.pdf") do (
这样修改之后,测试打印出来的指令是正确的,不知道是不是我电脑原因打印文件没有发送到打印机,楼主可以测试一下

Monitor 发表于 2024-10-17 10:44

@echo off
setlocal enabledelayedexpansion
set "acroFound=0"

:: 遍历所有磁盘
echo 程序初始化中,查询您是否已安装PDF阅读软件。。。。。
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
if exist %%d:\ (
:: 检查每个磁盘的根目录及其子目录中是否存在AcroRd32.exe
::dir /b /s %%d:\AcroRd32.exe >nul 2>&1
dir /b /s "%%d:\Program Files (x86)\Adobe Reader9.4\Adobe Reader\Reader\AcroRd32.exe" >nul 2>&1
if !errorlevel! equ 0 (
set "acroFound=1"
set CX="d:\Program Files (x86)\Adobe Reader9.4\Adobe Reader\Reader\AcroRd32.exe"
::set "CX='d:\Program Files (x86)\Adobe Reader9.4\Adobe Reader\Reader\AcroRd32.exe'"
goto :jx

for /f "delims=" %%i in ('dir /b /s %%d:\AcroRd32.exe') do (
::set "cx=%%i"
set cx="d:\Program Files (x86)\Adobe Reader9.4\Adobe Reader\Reader\AcroRd32.exe"
goto :jx :: 找到了就结束循环
)
)
)
)
:xz
cls
echo 你当前电脑未安装AcroRd PDF阅读器
echo.
echo 1进行下载,并关闭此脚本            2   直接关闭当前脚本
echo.
:cho
set choice=
set /p choice=          请输入对应的按回车:
IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%
if /i "%choice%"=="1" goto wz
if /i "%choice%"=="2" goto end
echo 选择无效,请重新输入
echo.
goto cho
:wz
cls
start "" "https://www.lanzoue.com/i1yhNf0uzje"
exit
rem 通过拖拽或输入文件名指定路径
:jx
cls
echo.
echo                              二虎电脑 PDF打印管理器
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo.┋
echo ┋   1、本程序用于快速批量打印PDF文件
echo ┋   2、本程序默认使用指定的PDF阅读器(Adobe Reader)并使用默认的打印机 ┋
echo.┋   3、本程序完全免费,旨在让您能快速完成繁琐的任务,解放双手
echo.┋   4、如发现BUG可联系作者进行反馈。
echo.┋   5、软件不设置版权限制,可以随意使用,但是不允许拿去卖钱!!
echo.┋
echo ┋                              作者:二虎电脑 同V
echo.╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
set "folder=%~1"
::for /f "delims=" %%i in ('powershell -command "(Get-WmiObject -Class Win32Printer | Where-Object { $.Default -eq $true }).Name"') do set printer=%%i
for /f "delims=" %%i in ('powershell -command "(Get-WmiObject -Class Win32_Printer -Filter 'Default = True').Name"') do set printer=%%i

if "%folder%"=="" set /p folder="请输入包含PDF文件的文件夹路径(支持直接将文件夹拖拽到本脚本)并按回车确认: "
rem 本脚本加密部分,需要输入密码才能继续使用本程序进行打印
setlocal enabledelayedexpansion
set InputPrompt=请输入密钥以继续:
set CorrectKeyMsg=密钥正确,继续执行...
set WrongKeyMsg=密钥错误,请重新输入或按X键退出...
set RetryPrompt=是否重新输入(Y/N)?:
set InvalidInputMsg=无效输入,请重新选择...
goto start
:PasswordLoop
set /p UserKey=!InputPrompt!
if "%UserKey%"=="52pj" (
echo !CorrectKeyMsg!
goto start
) else (
echo !WrongKeyMsg!
set /p Choice=!RetryPrompt!
if /i "%Choice%"=="Y" goto PasswordLoop
if /i "%Choice%"=="X" goto end
echo !InvalidInputMsg!
goto PasswordLoop
)
rem 指定完毕执行以下命令

:end
exit
rem 打印执行操作部分
:start

ECHO 请输入您要打印的份数(0-9,最大支持数字为9)
set cs=
set /p cs=          请输入对应的按回车:
IF NOT "%cs%"=="" SET cs=%cs:~0,1%
for /L %%i in (1,1,%cs%) do (
echo 正在执行打印操作中。。。

for /R "%folder%" %%i in (*.pdf) do (
::set "pdf_list=!pdf_list!;%%i"
echo 正在打印 %%i ...
%CX% /t "%%i" "%printer%"
)

echo 第 %%i 次打印操作完成。
)
rem 执行完毕,反馈信息
echo.
echo 所有PDF文件打印完毕,摁任意键退出此脚本。
pause

上面代码自己修复一下AcroRd32.exe路径,我这里测试可以打印的。
打印后AcroRd32.exe不会自动关闭,或许有参数设置打印后自动关闭。

Love0912 发表于 2024-10-17 11:55

Monitor 发表于 2024-10-17 10:44
@echo off
setlocal enabledelayedexpansion
set "acroFound=0"


https://thumbnail1.baidupcs.com/thumbnail/06450b68fi89b6024661662204282ac1?fid=472742-250528-869093576526977&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-%2f45tTcEwYjveph9niFEvprC2SJY%3d&expires=8h&chkbd=0&chkv=0&dp-logid=9042751249670902531&dp-callid=0&time=1729134000&size=c1680_u1050&quality=90&vuk=472742&ft=image&autopolicy=1
打印的时候基本就是这个样子了,不知道是哪里出错了,无法进行打印
您也可以按我的需求给搞一搞
自动检索磁盘内是否有AcroRd32.exe,如果有的话,将路径赋值给CX,然后在打印环节打印调用即可
打印后不能关闭也不是什么大事情,那个暂时搞不定也可以后面再说,现在是研究看看怎么能实现落地打印。。

Monitor 发表于 2024-10-17 12:20

Love0912 发表于 2024-10-17 11:55
打印的时候基本就是这个样子了,不知道是哪里出错了,无法进行打印
您也可以按我的需求给搞一搞
自动 ...

路径带有空格,需要用引号引回来
页: [1] 2 3
查看完整版本: PDF打印无法实现问题 批处理编码故障求助