我在使用shell_exec()的PHP脚本调用的批处理文件中有以下代码:
"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"
/t "D:\xampp\htdocs\instrument\app\webroot\Repair Tickets\%1.pdf"
\\hnurenfp01\Accounts_FS-1128MFP
参数%1是从PHP脚本作为参数发送到批处理文件的文件名.
观察到的行为:
> PHP页面使用正确的参数成功调用批处理文件
>两个AcroRd32.exe实例在服务器上静默启动
> PDF文件打印到网络打印机
> AcroRd32.exe实例不会结束/关闭
>批处理文件继续运行(直到手动结束AcroRd32.exe进程)
> PHP脚本正在执行,因此阻止客户端计算机进一步执行任何操作
预期行为:
> PHP页面使用正确的参数成功调用批处理文件
>两个AcroRd32.exe实例在服务器上静默启动
> PDF文件打印到网络打印机
> AcroRd32.exe实例结束/关闭
>批处理脚本完成(反过来应该释放PHP脚本)
> PHP脚本继续并最终结束,以允许最终用户继续他们的工作
解决方案失败:
>在批处理文件中使用TASKKILL在打印后结束AcroRd32.exe进程,但即使使用/ F(强制)标志,AcroRd32.exe仍保持打开状态.当我手动结束AcroRd32.exe进程时,批处理文件继续,然后执行TASKKILL行,当然返回“无法找到进程”错误,因为它不再存在.所以看起来打印后控件没有返回到批处理文件,它仍然是AcroRd32.exe.
有没有人有任何想法如何在PDF打印后关闭Adobe Reader?
解决方法:
静默打印PDF文件:
AcroRd32.exe / N / T PdfFile PrinterName [PrinterDriver [PrinterPort]]
最后一个命令将打开一个新的Adobe Reader窗口,打印PDF文件然后终止
它的窗口除非该窗口恰好是唯一的Adobe Reader窗口:至少有一个Adobe Reader窗口将保持打开状态.
最后一句话是坏消息.
您可以通过START命令调用带有/ N和/ T选项的AcroRD32.exe,然后您的批处理文件可以在执行打印作业时立即继续.如果您不介意读者的一个实例保持打开状态,那么您就完成了.
如果你必须关闭阅读器,那么你的批次将不得不杀死它.但我不确定您的批处理文件如何告诉打印作业何时完成.您可以使用TIMEOUT引入任意延迟,但这听起来很危险.
我对打开的“两个AcroRd32.exe实例”感到有点困惑.如果这是程序的工作方式,那么听起来/ N开关将关闭2个实例中的1个.您的批处理可以通过START启动打印作业,延迟几秒钟以使打印作业进程有时间启动,然后使用TASKLIST | FINDSTR监视循环中的AcroRd32.exe进程数.当计数从2变为1时,打印作业应该完成,您可以终止剩余的过程.理论上无论如何:)
祝好运.
标签:php,batch-file,shell-exec
来源: https://codeday.me/bug/20190630/1333822.html