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:
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.