2017-12-08 21 views
2

VBA의 경계에서 Gnuplot을 실행 중이며 놀라 울 정도로 잘 작동합니다. GNUPLOT과 Word VBA를 사용하여 약 100 개의 그래프로 된 전체 책을 만들 수 있습니다. (Excel 그래프를 사용하면 약 4가 될 수 있습니다.)GNUPLOT 대 VBA - STDERR은 어디로 갔습니까?

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는 다음

"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 표현식에서 첫 번째 항목은 내 시스템에서 "C:\temp\Gnuplot\bin\gnuplot.exe" 인 GNUPLOT 프로그램의 위치입니다. 두 번째 파일은 공식 Microsoft 위치 C:\Users\VVKOZLOV\AppData\Local\Temp\gnuA5E0.txt에서 생성 된 임시 파일입니다. 마지막은 STDERR의 위치입니다. 2>"C:\Users\VVKOZLOV\AppData\Local\Temp\gnuA5E2.err" 2>는 이것이 정상 출력 STDOUT이 아니라 STDERR임을 나타냅니다.

지금 나는 GNUPLOT 소스에 의도적 인 오류를 소개 가정, 내가 VBA의 외부 보통 CMD.EXE에 실행되면

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

같은 것을 포함 작성된 오류 파일을 기대할 수는 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

감사합니다. Ben. 그것은 그 마법의 따옴표입니다. –

답변

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을 사용했다. 그것은 내가 작성한 원래의 코드에 거의 변화가 없었다. –