Tech Tip: How to do console redirection when using LAUNCH EXTERNAL PROCESS
PRODUCT: 4D | VERSION: 11.4 | PLATFORM: Win
Published On: November 12, 2009
Here is a quick tip for using console redirection (redirecting the output of a command) when launching a command with LAUNCH EXTERNAL PROCESS.
Suppose you wanted to issue a command with console redirection; such as a ping:
The above will not work with LAUNCH EXTERNAL PROCESS.
However the command runs fine without the console redirection (i.e. "ping server").
There are two general approaches for how to accomplish this:
Suppose you wanted to issue a command with console redirection; such as a ping:
LAUNCH EXTERNAL PROCESS("ping server > test.txt";$input;$output;$error) |
The above will not work with LAUNCH EXTERNAL PROCESS.
However the command runs fine without the console redirection (i.e. "ping server").
LAUNCH EXTERNAL PROCESS("ping server";$input;$output;$error) |
There are two general approaches for how to accomplish this:
- Prefix your command with "cmd /C " like this:
LAUNCH EXTERNAL PROCESS("cmd /C ping server > test.txt";$input;$output;$error) - Build a wrapper file (bat file on windows) and then launch that using LAUNCH EXTERNAL PROCESS.
Detailed Examples:
- Approach 1:
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;*) - Approach 2:
We can work around the LAUNCH EXTERNAL PROCESS problem by programmatically creating a bat file to run that does the redirection inside of it and then use LAUNCH EXTERNAL PROCESS to launch the bat file. Please see the following sample code: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
You may need to play around with the timing in the delay in order to allow ample time for the command to finish; but the above gives an example of how this can be achieved.