Question OS-COMMAND and the quotes.

I need to start a Progress session using a OS-COMMAND.
There is a space in DLC path , so I need to put the path to the executable file in quotation marks.
Also I need to use the quotes for the parameters passed to a Progress executable (e.g. for –pf).
But if the command uses more than one pair of quotes, I get an error as if they were not used at all:
Code:
DEFINE VARIABLE vCommand AS CHARACTER NO-UNDO.
ASSIGN vCommand = SEARCH("_progres.exe").
OS-COMMAND VALUE(QUOTER(vCommand) + ' -param ""').
'C:\Progress\OpenEdge' is not recognized as an internal or external command, operable program or batch file.

Test without Progress:
Code:
DEFINE VARIABLE vCommand AS CHARACTER NO-UNDO.
ASSIGN vCommand = '"cmd" /c echo param "abc"x'.
OS-COMMAND VALUE(vCommand).

Instead of
param "abc"x
I’m getting:
param "abcx

One quote is always lost - no matter how many quotes I would add.

Code:
DEFINE VARIABLE vCommand   AS CHARACTER NO-UNDO.
ASSIGN vCommand = 'cmd /c echo param "abc"x'.
OS-COMMAND VALUE(vCommand).

It returns the expected result:
param "abc"x

Note: there are no quotation marks around cmd - it's the only difference.

Is this a known issue? Is there a solution?
 
Last edited:
Starting something via OS-COMMAND is a real pain. I used to generate a batch file and then start that, but now I use this:
Code:
/*-----------------------------------------------------------------------
  File : startSession.p
  Desc : Start a new session

  PARAMETERS:
  - pcProgram   : The startup procedure. Cannot have parameters itself
  - pcParameter : Value that will be added via -param
                                     
  ------------------------------------------------------------------------*/

&IF "{&FILE-NAME}" MATCHES "*.cmp" &THEN /* from editor */
  DEFINE VARIABLE pcProgram   AS CHARACTER NO-UNDO INITIAL 'c:\temp\helloWorld.p'.
  DEFINE VARIABLE pcParameter AS CHARACTER NO-UNDO INITIAL 'testing-1-2-3'.
&ELSE
  DEFINE INPUT PARAMETER pcProgram AS CHARACTER NO-UNDO.
  DEFINE INPUT PARAMETER pcParameter AS CHARACTER NO-UNDO.
&ENDIF

PROCEDURE ProExec EXTERNAL "PROEXEC.DLL" CDECL:
  DEFINE INPUT PARAMETER prog_name     AS CHARACTER.
  DEFINE INPUT PARAMETER prog_style    AS LONG. /* 1=normal 2=minimized */
  DEFINE INPUT PARAMETER wait_for_me   AS LONG.
  DEFINE INPUT PARAMETER num_seconds   AS SHORT.
  DEFINE RETURN PARAMETER return_value AS LONG.
END.

DEFINE VARIABLE cProwin  AS CHARACTER NO-UNDO.
DEFINE VARIABLE cParams  AS CHARACTER NO-UNDO.
DEFINE VARIABLE i        AS INTEGER   NO-UNDO.
DEFINE VARIABLE lSkip    AS LOGICAL   NO-UNDO.
DEFINE VARIABLE cCommand AS CHARACTER NO-UNDO.
DEFINE VARIABLE iStat    AS INTEGER   NO-UNDO.

// Determine progress executable (32 or 64 bit)
FILE-INFO:FILE-NAME = "prowin.exe".
IF FILE-INFO:FULL-PATHNAME = ? THEN FILE-INFO:FILE-NAME = "prowin32.exe".
cProwin = FILE-INFO:FULL-PATHNAME.
IF cProwin = ? THEN
DO:
  MESSAGE 'Progress executable not found' VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
  RETURN.
END.

// Find startup procedure
IF SEARCH(pcProgram) = ? THEN
DO:
  MESSAGE 'Program "' + pcProgram + '" not found' VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
  RETURN.
END.

// Build parameter list
DO i = 1 TO NUM-ENTRIES(SESSION:STARTUP-PARAMETERS):
 
  IF ENTRY(i, SESSION:STARTUP-PARAMETERS) = '(end .pf)' THEN
  DO:
    lSkip = FALSE.
    NEXT.
  END.

  IF NOT lSkip THEN
    cParams = cParams + ' ' + ENTRY(i, SESSION:STARTUP-PARAMETERS).

  IF ENTRY(i, SESSION:STARTUP-PARAMETERS) BEGINS '-pf' THEN
    lSkip = TRUE.
END.

cCommand = SUBSTITUTE('&1 &2 -p &3', cProwin, cParams, pcProgram).
IF pcParameter <> "" THEN cCommand = SUBSTITUTE('&1 -param "&2"', cCommand, pcParameter).

&IF "{&FILE-NAME}" MATCHES "*.cmp" &THEN /* from editor */
  MESSAGE cCommand VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
&ENDIF

RUN ProExec(cCommand, 1, 0, 5, OUTPUT iStat).
 

Attachments

Thank you, Patrick!
I agree - OS-COMMAND seems to be a dead end.
The bug is very tricky. I can't understand its logic. It's the only reason why I'm still trying to find out a solution.
 
FILE-INFO:FILE-NAME = "prowin.exe". IF FILE-INFO:FULL-PATHNAME = ? THEN FILE-INFO:FILE-NAME = "prowin32.exe". cProwin = FILE-INFO:FULL-PATHNAME.

4 days ago Tom Bascom wrote:
"I wouldn't be using PROWIN.EXE for a background service. That is the job of _PROGRES.EXE"

Progress community appears to be divided into parties - the supporters of prowin and the ones who prefer _progres. :)
 
Workaround for OS-COMMAND is found: the extra quotation marks around the whole command:
Code:
DEFINE VARIABLE vCommand   AS CHARACTER NO-UNDO.
ASSIGN vCommand = SEARCH("_progres.exe").
OS-COMMAND VALUE('"' + QUOTER(vCommand) + ' -param "a b""').

It's still a mystery.
 
Back
Top