吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 714|回复: 20
收起左侧

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

[复制链接]
Love0912 发表于 2024-10-17 08:14
500吾爱币
本帖最后由 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 Win32Printer | 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

最佳答案

查看完整内容

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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

代码用的不是MD里面加入的,在MD右边有个<>,这个就是“添加代码文字”功能,在这里放入代码
jorlaying 发表于 2024-10-17 08:35
[Bash shell] 纯文本查看 复制代码
@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
[mw_shl_code=bash,true]@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
[Asm] 纯文本查看 复制代码
@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
[mw_shl_code=asm,true]@echo off
setlocal enabledelayedexpansion
set "acroFound=0"


打印的时候基本就是这个样子了,不知道是哪里出错了,无法进行打印
您也可以按我的需求给搞一搞
自动检索磁盘内是否有AcroRd32.exe,如果有的话,将路径赋值给CX,然后在打印环节打印调用即可
打印后不能关闭也不是什么大事情,那个暂时搞不定也可以后面再说,现在是研究看看怎么能实现落地打印。。
Monitor 发表于 2024-10-17 12:20
Love0912 发表于 2024-10-17 11:55
打印的时候基本就是这个样子了,不知道是哪里出错了,无法进行打印
您也可以按我的需求给搞一搞
自动 ...

路径带有空格,需要用引号引回来
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 13:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表