Tips

LAUNCH EXTERNAL PROCESSでリダイレクトを実行する方法

日付2009/12/09
ID75938 (英語原文参照)
バージョン11.4
プラットフォームWin

LAUNCH EXTERNAL PROCESSで実行したコマンドのリダイレクト(コンソールコマンドの出力先を変えること)を実行する簡単な方法があります。

たとえば、下記のようなコマンドを実行したいとしましょう。

LAUNCH EXTERNAL PROCESS("ping server > test.txt";$input;$output;$error)

LAUNCH EXTERNAL PROCESSは、上記のようなコードを処理できません。

リダイレクトがなければ、実行することができます。

LAUNCH EXTERNAL PROCESS("ping server";$input;$output;$error)

リダイレクトする方法は基本的にふたつ考えられます。

コードの前に"cmd /C"を追加する方法。

LAUNCH EXTERNAL PROCESS("cmd /C ping server > test.txt";$input;$output;$error)

バッチファイルを作成してそのファイルをLAUNCH EXTERNAL PROCESSで実行する方法。

コードの前に"cmd /C"を追加するのであれば、次のように記述します。

C_TEXT($file)
C_TEXT($fileContents)
C_TEXT($input)
C_TEXT($output)
C_TEXT($error)
C_TEXT($curDir)
C_TEXT($serverIP)
C_LONGINT($wait;$count;$delay)

$curDir:=Get 4D folder(Database Folder)

$serverIP:="your_server_ip"

$wait:=500 ` maximum time to wait for a response (in miliseconds)
$count:=10 ` total number of iterations to try (in miliseconds)
$delay:=(($wait*$count)/1000)*60 ` amount of time to wait for command to finish

$resultsFile:="results.txt"

$file:="ping -n "+String($count)+" -w "+String($wait)+" "+$serverIP
$file:=$file+" > \""+$curDir+$resultsFile+"\""

SET ENVIRONMENT VARIABLE("_4D_OPTION_CURRENT_DIRECTORY";$curDir)
SET ENVIRONMENT VARIABLE("_4D_OPTION_BLOCKING_EXTERNAL_PROCESS";"false")
SET ENVIRONMENT VARIABLE("_4D_OPTION_HIDE_CONSOLE";"true")

LAUNCH EXTERNAL PROCESS("cmd /C "+$file;$input;$output;$error)

DELAY PROCESS(Current process;($delay+200))` an extra 200 tick delay for good measure

SHOW ON DISK($resultsFile;*)

バッチファイルを作成するのであれば、次のように記述します。

C_TEXT($file)
C_TEXT($fileContents)
C_TEXT($input)
C_TEXT($output)
C_TEXT($error)
C_TEXT($curDir)
C_TEXT($serverIP)
C_LONGINT($wait;$count;$delay)

$curDir:=Get 4D folder(4D Client Database Folder )

$serverIP:="your_server_ip"

$wait:=500 ` maximum time to wait for a response (in miliseconds)
$count:=10 ` total number of iterations to try (in miliseconds)
$delay:=(($wait*$count)/1000)*60 ` amount of time to wait for command to finish
$resultsFile:="results.txt"

$fileContents:="ping -n "+String($count)+" -w "+String($wait)+" "+$serverIP
$fileContents:=$fileContents+" > \""+$curDir+$resultsFile+"\""
$fileContents:=$fileContents+Char(13)+Char(10)
$fileContents:=$fileContents+"exit"

$file:="tempPingFile.bat"

C_TIME($vhDoc)
$vhDoc:=Create document($curDir+$file)
If (OK=1)
 SEND PACKET($vhDoc;$fileContents)
 CLOSE DOCUMENT($vhDoc)


 SET ENVIRONMENT VARIABLE("_4D_OPTION_CURRENT_DIRECTORY";$curDir)
 SET ENVIRONMENT VARIABLE("_4D_OPTION_BLOCKING_EXTERNAL_PROCESS";"false")
 SET ENVIRONMENT VARIABLE("_4D_OPTION_HIDE_CONSOLE";"true")

 LAUNCH EXTERNAL PROCESS("cmd /C "+$file;$input;$output;$error)

 DELAY PROCESS(Current process;($delay+200))` an extra 200 tick delay

 DELETE DOCUMENT($file)

 SHOW ON DISK($resultsFile;*)

Else 

 ` error creating temp bat file

End if

結果を取り出すタイミングなど、細かい調整が必要ですが、原則的には上記いずれの方法でもリダイレクトを実行することができます。