如何在Progress-4GL中捕获OS-COMMAND的执行结果?
解决Progress中捕获OS-COMMAND输出并写入锁定日志文件的问题
首先,你遇到的问题确实是因为Progress在打开日志文件时会独占锁定它,导致外部shell进程无法直接追加内容。要解决这个问题,我们需要先把OS-COMMAND的输出捕获下来,再通过Progress自身的写入操作把内容追加到日志里,这里有两种可靠的实现方式:
方法一:通过临时文件中转输出
这是最直观的方案,先把WMIC命令的输出写入临时文件,再让Progress读取临时文件内容并写入主日志,最后清理临时文件:
/* 定义临时文件路径(确保有写入权限) */ DEFINE VARIABLE cTempOutput AS CHARACTER NO-UNDO VALUE "C:\Temp_Folder\printer_temp_output.txt". /* 执行WMIC命令,将输出写入临时文件(用>覆盖,避免追加旧内容) */ OS-COMMAND SILENT NO-WAIT VALUE("WMIC printer get name, deviceID > " + QUOTER(cTempOutput)). /* 等待命令执行完成(NO-WAIT可能导致文件还没写完就读取,可根据情况调整) */ PAUSE 1. /* 简单等待,或者用更可靠的方式检测文件是否生成 */ /* 读取临时文件内容并写入主日志 */ INPUT FROM VALUE(cTempOutput). REPEAT: DEFINE VARIABLE cLine AS CHARACTER NO-UNDO. IMPORT UNFORMATTED cLine. /* 写入到当前打开的主日志文件 */ PUT UNFORMATTED cLine SKIP. END. INPUT CLOSE. /* 删除临时文件 */ OS-COMMAND SILENT VALUE("DEL /F /Q " + QUOTER(cTempOutput)).
注意点:
- 使用
QUOTER()函数包裹文件路径,避免路径中有空格时出现命令错误 NO-WAIT参数会让命令后台执行,可能需要添加等待逻辑(比如PAUSE或者循环检测文件是否存在),确保临时文件已经生成再读取SILENT参数可以避免弹出命令行窗口,提升用户体验
方法二:直接捕获OS-COMMAND输出到变量(适合短输出)
如果WMIC的输出内容不多,也可以直接把命令输出捕获到Progress变量中,省去临时文件的步骤:
DEFINE VARIABLE cPrinterOutput AS CHARACTER NO-UNDO. /* 执行命令并将输出捕获到变量 */ OS-COMMAND SILENT VALUE("WMIC printer get name, deviceID") OUTPUT TO VALUE(cPrinterOutput). /* 将捕获到的内容写入主日志 */ PUT UNFORMATTED cPrinterOutput SKIP.
注意点:
- 这种方式对长输出可能有长度限制,适合输出内容较短的场景
- 不需要额外处理临时文件,代码更简洁
关键原理说明
之所以不能直接用>>追加到Progress锁定的日志文件,是因为Progress默认以独占模式打开文件,阻止其他进程写入。通过上述两种方式,我们让Progress作为中间层:先把外部命令的输出拿到Progress可控的范围(临时文件或变量),再通过Progress自身的PUT语句写入日志,这样就绕开了文件锁定的问题。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

