2013-02-14 20 views
7

次のコマンドは、pdfファイルでghostscriptを実行します。 (pdf_file変数はそのPDFファイルへのパスを含む)Rスクリプトが自動化された場合の結果が異なります

bbox <- system(paste("C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH -f", pdf_file, "2>&1"), intern=TRUE) 

実行bboxは、以下の文字列を含む後。

GPL Ghostscript 8.64 (2009-02-03) 
Copyright (C) 2009 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Processing pages 1 through 1. 
Page 1 
%%BoundingBox: 36 2544 248 2825 
%%HiResBoundingBox: 36.395015 2544.659922 247.070032 2824.685914 
Error: /undefinedfilename in (2>&1) 
Operand stack: 

Execution stack: 
    %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 
Dictionary stack: 
    --dict:1147/1684(ro)(G)-- --dict:1/20(G)-- --dict:69/200(L)-- 
Current allocation mode is local 
Last OS error: No such file or directory 
GPL Ghostscript 8.64: Unrecoverable error, exit code 1 

この文字列は、次に、PDFファイルをトリミングするために単離して使用されるこのBoundingBox寸法(36 2544 248 2825)ために操作されます。これまでのところすべて正常に動作します。

しかし、タスクマネージャ(Rscript.exeまたはRcmd.exe BATCHを使用)でこのスクリプトをスケジュールするとき、またはスクリプトがRチャンク内にあり、knit HTMLを押すと、bboxはBoundingBoxがない次の文字列を取得しますこの問題を乗り越えてスクリプトを自動実行するにはどうすればよいですか?

(スクリプトがthat questionに受け入れ答えから来ている)

+0

のようなバウンディングボックスがに書き込まれますstderr、 、 '2>&1'はstderrをstdoutにリダイレクトします。 しかし、この構文は明らかにWindowsでは認識されません。 –

+0

Windowsのコマンドプロセッサで認識されますが、これはコマンドシェルから実行されていないため、リダイレクトは実行されません。 – KenS

+0

'pdf_file'にはPDFの完全パスが含まれていますか? – robertklep

答えて

6

作ることができますこの方法では、ありませんシェル。 Ghostscript interprets it a file、したがってエラーです。私は、プロセスの作成を見てprocmonの使用:

stderr redirection is treated as a file by ghostscript

シェルがそれを解釈するようにするには、cmd /cでコマンドの前に付ける必要があり、この

> bbox <- system(paste("cmd /c C:/Progra~1/gs/gs9.07/bin/gswin64c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH -q -f",pdf_file,"2>&1"), intern=TRUE) 
> print (bbox) 
[1] "%%BoundingBox: 28 37 584 691"         "%%HiResBoundingBox: 28.997999 37.511999 583.991982 690.839979" 
2

デバイスの出力はstdoutに起こっている、エラーはstderrに起こっています。端末では、これらは明らかに端末に送信され、一緒に表示されます.2番目のケースでは、明らかにそうではなく、標準出力が欠落しています。

エラーメッセージが表示される(2> & 1)ので、あまり驚くことではありません。これはstdoutをファイルにリダイレクトしているようですが、2つの問題があります。まず、出力するファイル名を指定せず、コマンドシェルでは実行していないため、コマンドプロセッサはリダイレクトを行いません。

私はRについて何も知っていません。その方法を教えてもらえませんが、コマンドラインから '2> & 1'を削除することから始めてください。また、4歳未満のGhostscriptを使用することを検討することもできます。現在のバージョンは9.07で、リリースされました。

+0

gs 9.06でも同じ問題があったので、古いバージョンを試し始めました。 –

+0

'2>&1'を削除しても助けにならない –

+0

これは役に立ちません。ただエラーを取り除きます。あなたの問題は、出力がstdoutに向けられている間にstderrをキャプチャしているように見えます。 stdoutをキャプチャするか、stdoutをstderrにリダイレクトする必要があります(コマンドシェルでは&2> 1となります)。stdoutをファイルにリダイレクトして読み込みます。 – KenS

1

これを試してください。

セットenvironmental variable

は次に、上記のリンクに基づい%のENVVAR%の表記を使用使用して、出力ファイルは、ファイル名金曜日に置き換えることであろう%今日%となります。 -fは必要ではありませんが、傷ついてはいけません。出力をルーティングする場合は、2番目のenv変数を設定し、それを>%outenv%にルーティングします。

あなたは、コマンドの末尾に追加2>&1はghostscriptのインタプリタに送られ、単純なシステムコール(変数ではなく、固定の文字列を使用するためのリンクを参照してください)、

Sys.setenv(envvar= "pdf.file") 
Sys.setenv(outenv= "out.file") 
"C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH %envvar% >%outenv%" 
関連する問題