将 Powershell 封装在 Progress 类中

问题描述 投票:0回答:1

我正在尝试围绕

Powershell
实现一个类包装器。 它几乎可以工作,除了当它无法从
STREAM
读取更多输出时它会挂起。 所以它设法读取所有输出,但是在没有更多输出之后,它只是挂在
IMPORT
语句中:

BLOCK-LEVEL ON ERROR UNDO, THROW.

    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.

用途:

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'").
powershell openedge progress-4gl
1个回答
0
投票

你可以尝试这样的事情:

METHOD PROTECTED CHAR ReadOutput():
    
    DEF VAR cOutputs AS CHAR NO-UNDO.

    do while true:

        readkey STREAM stPowershell pause 0.

        if lastkey <= 0 then
          leave.
         else
          cOutputs = cOutputs + chr( lastkey ).

    END.
    
    RETURN cOutputs.

END.
© www.soinside.com 2019 - 2024. All rights reserved.