首页 > 解决方案 > 如何在 Progress-4GL 中捕获 OS-COMMAND 结果?

问题描述

我正在使用日志记录工具,如另一篇文章中所述:

OUTPUT TO VALUE("C:\Temp_Folder\logfile.txt").
...
PUT UNFORMATTED "Start : Check-zones" SKIP.
...
OUTPUT CLOSE.

这工作正常。

现在我想OS-COMMAND在输出文件中添加一个结果。
我已经尝试过以下方法:(将结果放入新创建的文件中)

OS-COMMAND NO-WAIT VALUE("WMIC printer get name, deviceID >> C:\Temp_Folder\Printers.txt").

这工作正常。
所以,我知道该命令工作正常。但是,以下方法不起作用:

OS-COMMAND NO-WAIT VALUE("WMIC printer get name, deviceID >> C:\Temp_Folder\LogFile.txt").

这很明显,因为C:\Temp_Folder\Logfile.txt进度应用程序已锁定写入,因此打开的外壳OS-COMMAND无法写入该文件。

为了克服这一点,我想捕捉OS-COMMAND's results 的结果。

我怎样才能做到这一点?

标签: command-lineopenedgeprogress-4gl

解决方案


不幸的是,在设计 os-command 的黑暗时代,抑制所有错误被认为是有用的。

您可以启动一个批处理文件并让它做一些“保证”输出错误处理,请参阅https://knowledgebase.progress.com/articles/Article/21039

或者(因为您在 Windows 上)您可以使用 .Net系统诊断过程类(您需要将其包装在您自己的方法或函数中以简化使用):

DEFINE VARIABLE oProcess   AS System.Diagnostics.Process NO-UNDO.
DEFINE VARIABLE lcstderr   AS LONGCHAR    NO-UNDO.
DEFINE VARIABLE lcstdout   AS LONGCHAR    NO-UNDO.

oProcess = NEW System.Diagnostics.Process().

oProcess:StartInfo:FileName = "wmic.exe".
oProcess:StartInfo:Arguments = "printer get name, deviceID".
oProcess:StartInfo:CreateNoWindow         =  TRUE.
oProcess:StartInfo:UseShellExecute        =  FALSE.
oProcess:StartInfo:RedirectStandardError  =  TRUE.
oProcess:StartInfo:RedirectStandardOutput =  TRUE.
oProcess:Start().

lcstdout = oProcess:StandardOutput:ReadToEnd().
lcstderr = oProcess:StandardError:ReadToEnd().

oProcess:WaitForExit().

lcstdout = lcstdout + oProcess:StandardOutput:ReadToEnd().
lcstderr  = lcstderr + oProcess:StandardError:ReadToEnd().


推荐阅读