如何在 Progress-4GL 中捕获 OS-COMMAND 结果?

问题描述

我正在使用日志记录工具,如 this other post 中所述:

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 类(您需要将其包装在您自己的方法或函数中以简化使用):

IF EXISTS
(
    SELECT * FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA= 'dbo' AND TABLE_NAME = 'Food_tbl'
)
BEGIN
    IF (SELECT COUNT(*) FROM dbo.Food_tbl)=20
    BEGIN
        PRINT N'Table Exists'
        SELECT *
        FROM Food_tbl
    END
    ELSE
    BEGIN
        print N'there isnt 20'
        INSERT INTO Food_tbl (Food_tbl.FID,Food_tbl.Fname,Food_tbl.Ftype,Food_tbl.Fcount,Food_tbl.Datetype,Food_tbl.Fdescription)
        SELECT DataFoodView.*
        FROM DataFoodView 
        LEFT JOIN FoodSara_tbl ON Food_tbl.FID = DataFoodView.FID
        WHERE Food_tbl.FID IS NULL;     
    END
END