[Stackoverflow] [Progress OpenEdge ABL] Wrap Powershell in Progress class

Status
Not open for further replies.
W

W0lfw00ds

Guest
I'm trying to implement a class wrapper around Powershell. It almost works, except that it hangs when it cannot read any more output from the STREAM. So it manages to read all output, but after theres no more, it just hangs in IMPORT statement:

BLOCK-LEVEL ON ERROR UNDO, THROW.

Code:
CLASS Powershell:
    DEF PRIVATE STREAM stPowershell.
    
    CONSTRUCTOR PUBLIC Powershell():
        INPUT-OUTPUT STREAM stPowershell THROUGH VALUE("powershell").
        THIS-OBJECT:ReadOutput().
    END.
    
    DESTRUCTOR Powershell():
        INPUT-OUTPUT STREAM stPowershell CLOSE.
    END.
    
    METHOD PUBLIC CHAR Input(i_cInput AS CHAR):
        IF i_cInput = ? THEN UNDO, THROW NEW Progress.Lang.AppError(SUBST("&1: 'i_cInput' is 'UNKNOWN'!", PROGRAM-NAME(1))).
        
        PUT STREAM stPowershell UNFORMATTED i_cInput SKIP.
        
        RETURN THIS-OBJECT:ReadOutput().
    END.
    
    METHOD PROTECTED CHAR ReadOutput():
    
        DEF VAR cOutputs AS CHAR NO-UNDO.
        DEF VAR cOutput  AS CHAR NO-UNDO.
        DEF VAR lFirst   AS LOGICAL NO-UNDO INIT TRUE.
        
        REPEAT:
            IF lFirst THEN lFirst = FALSE.
                      ELSE cOutputs = cOutputs + "~n".
            
            IMPORT STREAM stPowershell UNFORMATTED cOutput NO-ERROR.
            cOutputs = cOutputs + cOutput.
        END.
        
        RETURN cOutputs.
    END.
    
END.

Usage:

Code:
DEF VAR oPowershell AS CLASS Powershell NO-UNDO.
DEF VAR cOutput     AS CHAR NO-UNDO.

oPowershell = NEW Powershell().
cOutput = oPowershell:Input("$num = 12").
cOutput = oPowershell:Input("(New-Object -ComObject Wscript.Shell).Popup($num, 0, 'Done', 0x0)").
cOutput = oPowershell:Input("Write-Output 'test output'").

Continue reading...
 
Status
Not open for further replies.
Top