如何在 DCL 中编辑输出的文本 -- OpenVMS 脚本

How to Edit a text from the output in DCL -- OpenVMS scripting

我写了下面的代码,它将提取目录名和文件名,我将在提取的文本上使用清除命令。

$ sear VAXMANAGERS_ROOT:[PROC]TEMP.LIS LOG/out=VAXMANAGERS_ROOT:[DEV]FVLIM.TXT
$ OPEN IN VAXMANAGERS_ROOT:[DEV]FVLIM.TXT
$ LOOP:
$ READ/END_OF_FILE=ENDIT IN ABCD
$ GOTO LOOP
$ ENDIT:
$ close in
$ ERROR=F$EXTRACT(0,59,ABCD)
$ sh sym ERROR
$ purge/keep=1 'ERROR'

输出结果如下:

ERROR = "$DKC102:[PROD_LIVE.LOG]DP2017_TMP2.LIS;27392             "

这里的问题是 --- 每次目录长度都不同(长度可能是 59 或 40 或其他值,但在我的系统中目录和文件名长度不会超过 59 个字符)。所以在上面的输出中,系统也在获取那个文件号的版本号。所以我无法连同版本号一起清除文件。

%PURGE-E-PURGEVER, version numbers not permitted

任何建议 -- 如何从输出中删除版本号?

我不能使用目录的确切长度,因为目录长度每次都不同.... :(

虽然HABO已经解释过了,但还有一些解释

假设我使用 f$search 来检查文件是否存在

a = f$search("sys$manager:net$server.log")

然后我发现它存在

wr sys$output a

显示

SYS$SYSROOT:[SYSMGR]NET$SERVER.LOG;9

在 f$parse 的帮助下我得到

help lex f$parse arg

显示,除此之外

`指定包含字段名称的字符串 在文件规范中。指定字段参数导致 F$PARSE 函数 return 文件的特定部分 规范。

     Specify one of the following field names (do not abbreviate):

     NODE       Node name
     DEVICE     Device name
     DIRECTORY  Directory name
     NAME       File name
     TYPE       File type
     VERSION    File version number`

所以我能做到

wr sys$output f$parse(a,,,"DEVICE")

显示

SYS$SYSROOT:

还有

wr sys$output f$parse(a,,,"DIRECTORY")

所以我得到

[SYSMGR]

wr sys$output f$parse(a,,,"NAME")

显示

NET$SERVER

wr sys$output f$parse(a,,,"TYPE")

显示

.LOG

版本是

wr sys$output f$parse(a,,,"VERSION")

显示为

;9

词法函数很方便,使用

检查一下

help lexical

显示

F$CONTEXT F$CSID F$CUNITS F$CVSI F$CVTIME F$CVUI F$DELTA_TIME F$DEVICE F$DIRECTORY F$EDIT F$ELEMENT F$ENVIRONMENT F$EXTRACT F$FAO F$FID_TO_NAME F$FILE_ATTRIBUTES F$GETDVI F$GETENV F$GETJPI F$GETQUI F$GETSYI F$IDENTIFIER F$INTEGER F$LENGTH F$LICENSE F$LOCATE F$MATCH_WILD F$MESSAGE F$MODE F$MULTIPATH F$PARSE F$PID F$PRIVILEGE F$PROCESS F$READLINK F$SEARCH F$SETPRV F$STRING F$SYMLINK_ATTRIBUTES F$TIME F$TRNLNM F$TYPE F$UNIQUE F$USER

经确认,F$ELEMENT( 0, ";", ABCD ) 的答案应该有效。我可能会编写这样的脚本:

 $ ERROR = F$PARSE(";",ERROR) ! will return $DKC102:[PROD_LIVE.LOG]DP2017_TMP2.LIS;
 $ ERROR = ERROR - ";"
 $ PURGE/KEEP=1 'ERROR'

不确定为什么有读取循环。您将得到文件的最后一行,但假设这就是您想要的。