4

次のコードを使用してPHPスクリプトによって呼び出されるバッチファイルに次のコードがありますshell_exec()

"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の2つのインスタンスがサーバー上でサイレントに起動します
  • PDFファイルがネットワークプリンターに印刷されます
  • AcroRd32.exeインスタンスが終了/終了しない
  • バッチファイルは実行を続けます(AcroRd32.exeプロセスを手動で終了するまで)
  • PHPスクリプトは実行されたままであるため、クライアントマシンはそれ以上何もできません。

期待される動作:

  • PHPページが正しい引数でバッチファイルを正常に呼び出す
  • AcroRd32.exeの2つのインスタンスがサーバー上でサイレントに起動します
  • PDFファイルがネットワークプリンターに印刷されます
  • AcroRd32.exeインスタンスの終了/終了
  • バッチスクリプトが完了します(これにより、PHPスクリプトが解放されます)
  • PHPスクリプトは継続し、最終的には終了して、エンドユーザーが作業を続行できるようにします

失敗した解決策:

  • バッチファイルでTASKKILLを使用して、印刷後にAcroRd32.exeプロセスを終了しますが、/ F(強制)フラグを使用しても、AcroRd32.exeは開いたままになります。AcroRd32.exeプロセスを手動で終了すると、バッチファイルが続行され、TASKKILL行が実行されます。もちろん、プロセスが存在しないため、「プロセスが見つかりません」というエラーが返されます。したがって、コントロールは印刷後にバッチファイルに戻されないように見えますが、AcroRd32.exeのままです。

PDFの印刷後にAdobeReaderを閉じる方法を知っている人はいますか?

4

1 に答える 1

3

http://www.robvanderwoude.com/commandlineswitches.php#Acrobatで次の引用を見つけました

PDFファイルをサイレントに印刷します。

AcroRd32.exe /N /T PdfFile PrinterName [ PrinterDriver [ PrinterPort ] ]
最後のコマンドは、新しいAdobe Readerウィンドウを開き、PDFファイルを印刷してから、そのウィンドウが残っている唯一のAdobeReaderウィンドウでない限りそのウィンドウを終了します。少なくとも1つのAdobeReaderウィンドウが開いたままになります。

その最後の文は悪いニュースです。

STARTコマンドを使用して/Nオプションと/Tオプションの両方を指定してAcroRD32.exeを呼び出すと、印刷ジョブの実行中にバッチファイルをすぐに続行できます。リーダーの1つのインスタンスが開いたままであってもかまわない場合は、これで完了です。

リーダーを閉じる必要がある場合は、バッチでリーダーを強制終了する必要があります。しかし、印刷ジョブがいつ終了したかをバッチファイルがどのように判断できるかはわかりません。TIMEOUTを使用して任意の遅延を導入することもできますが、それは危険に聞こえます。

「AcroRd32.exeの2つのインスタンス」が開かれていることに少し混乱しています。それがプログラムの動作方法である場合、/Nスイッチが2つのインスタンスのうちの1つを閉じるように聞こえます。バッチは、STARTを介して印刷ジョブを起動し、印刷ジョブプロセスが開始する時間を与えるために数秒遅延してから、TASKLIST|FINDSTRを使用してループ内のAcroRd32.exeプロセスの数を監視できます。カウントが2から1になると、印刷ジョブが完了し、残りのプロセスを強制終了できます。とにかく理論的には:)

幸運を。

于 2012-05-03T12:10:33.367 に答える