如何在 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'
不确定为什么有读取循环。您将得到文件的最后一行,但假设这就是您想要的。
我写了下面的代码,它将提取目录名和文件名,我将在提取的文本上使用清除命令。
$ 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'
不确定为什么有读取循环。您将得到文件的最后一行,但假设这就是您想要的。