如何在 Progress-4GL 中捕获 OS-COMMAND 结果?
How to catch OS-COMMAND results in Progress-4GL?
我正在使用日志工具,如 中所述:
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
打开的 shell 无法写入该文件。
为了克服这个问题,我想赶上 OS-COMMAND
的结果。
我该怎么做?
不幸的是,在设计 os-command 的黑暗时代,抑制所有错误被认为是有用的。
您可以启动批处理文件并让它执行一些“有保证的”输出错误处理,请参阅 https://knowledgebase.progress.com/articles/Article/21039
或者(因为您在 Windows)您可以使用 .Net system diagnostics process class(您需要将其包装在您自己的方法或函数中以简化使用) :
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().
我正在使用日志工具,如
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
打开的 shell 无法写入该文件。
为了克服这个问题,我想赶上 OS-COMMAND
的结果。
我该怎么做?
不幸的是,在设计 os-command 的黑暗时代,抑制所有错误被认为是有用的。
您可以启动批处理文件并让它执行一些“有保证的”输出错误处理,请参阅 https://knowledgebase.progress.com/articles/Article/21039
或者(因为您在 Windows)您可以使用 .Net system diagnostics process class(您需要将其包装在您自己的方法或函数中以简化使用) :
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().