2017-12-08 19 views
2

私はVBAの範囲内でGnuplotを実行しています。それは驚くほどうまく機能します。私はGNUPLOTとWord VBAを使って、約100のグラフの本を作ることができます。 (Excelのグラフでは、おそらく約4になる可能性があります)GNUPLOTとVBA - STDERRはどこに行きましたか?

小さな問題が1つあります.VBAで実行すると、STDERRが消えるか、作成されていません。診断はありません。以下の小さなGNUPLOTスクリプトを考えると

set key bmargin left horizontal Right noreverse enhanced autotitle box lt black linewidth 1.000 dashtype solid 
set samples 800, 800 
set title "Simple Plots" 
set title font ",20" norotate 
DEBUG_TERM_HTIC = 119 
DEBUG_TERM_VTIC = 119 
plot [-30:20] sin(x*20)*atan(x) 

私のVBAコードは、一時ファイルに書き込み、それを実行しようとします。 VBAはそうのように呼び出され、その後、Windowsシェルでそれを実行

"C:\temp\Gnuplot\bin\gnuplot.exe" C:\Users\VVKOZLOV\AppData\Local\Temp\gnuA5E0.txt 2>"C:\Users\VVKOZLOV\AppData\Local\Temp\gnuA5E2.err" 

を生成します。その後、

Dim wsh As Object 
Set wsh = VBA.CreateObject("WScript.Shell") 

wsh.Run x, 0, True ' x contains the generated GNUPLOT expression 

GNUPLOTは完璧に実行されます。

GNUPLOT式では、最初の項目はGNUPLOTプログラムの場所で、私のシステムでは"C:\temp\Gnuplot\bin\gnuplot.exe"になります。 2番目のファイルは、公式のMicrosoftの場所C:\Users\VVKOZLOV\AppData\Local\Temp\gnuA5E0.txtで一時的に生成されます。最後に、STDERRの位置、2>"C:\Users\VVKOZLOV\AppData\Local\Temp\gnuA5E2.err"があります。ここで2>は、これがSTDERRであり、通常の出力STDOUTではないことを示しています。

は、今私はgnuplotのソースに意図的にエラーを導入したと、私は

scooby doo where are you? 
^ 
"C:\Users\VVKozlov\AppData\Local\Temp\gnuEC55.txt", line 4: invalid command 

のようなものを含む書かれたエラーファイルを期待するVBAの外に通常のCMD.EXEで実行すると、STDERRファイルが作成されます予想通り。

Windowsシェルを使用してVBAの境界内で実行された場合、STDERRファイルは作成されません。

このSTDERRファイルをVBAでどのように作成することができますか?

+0

'CmdLine =" CMD/S/C "" "&CmdLine&" "" "'のようなコマンドライン全体をラップします。これらは魔法の言葉です。 – Ben

+0

も参照してくださいhttps://stackoverflow.com/questions/2075886/capturing-output-from-wshshell-exec-using-windows-script-host/9063149#9063149 – Ben

+0

ありがとう、ベン。それらの魔法の余分な引用符です。 –

答えて

5

CreateObject("WScript.Shell").Runは、コマンドラインを直接実行します。

出力リダイレクト(使用している2>の構文)は、cmd.exe Windowsコマンドプロセッサの機能です。あなたが何をしたいか

のいずれかです:

  1. は、あなたがしたいargumentsとリダイレクトでCMD.EXEを実行します。
  2. CreateObject("WScript.Shell").Execを代わりに使用すると、入力ストリーム、出力ストリーム、およびエラーストリームに直接アクセスできます。 read from the streamが必要となり、内容をファイルに記録する場合は、スクリプト内でファイルに内容を書き込んでください。
+0

ヴァリアント2は私にとってうまくいきます。私は、STDERR出力をどこに送るべきかを明確に述べる必要はありません。また、エラーメッセージは、明示的に別のファイルを作成して読み込むことなく、文字列として私に届きます。今、迷惑な画面のフラッシュを取り除くために。 –

+0

最後に、私はVariant 1を使用しました。これは私が書いた元のコードにほとんど変更を加えずに働いていました。 –

関連する問題