我正在尝试围绕
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'").
你可以尝试这样的事情:
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.