我写了下面的代码,它将提取目录名和文件名,我将在提取的文本上使用purge命令。
$ 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 = "$1$DKC102:[PROD_LIVE.LOG]DP2017_TMP2.LIS;27392 "
问题在于---每次目录长度变化时(长度可能是59或40或其他值,但目录和文件名长度在我的系统中不会超过59个字符)。所以在上面的输出中,系统也提取该文件号的版本号。因此,我无法将文件与版本号一起清除。
%PURGE-E-PURGEVER, version numbers not permitted
任何建议 - 如何从输出中删除版本号?
我不能使用目录的确切长度,因为目录长度每次变化.... :(
答案 0 :(得分:1)
虽然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函数返回文件的特定部分 说明书
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
lexicals函数可以很方便,使用
进行检查 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
答案 1 :(得分:1)
F $ ELEMENT(0,“;”,ABCD)的答案应该有效,如证实。我可能会写这样的东西:
$ ERROR = F$PARSE(";",ERROR) ! will return $1$DKC102:[PROD_LIVE.LOG]DP2017_TMP2.LIS;
$ ERROR = ERROR - ";"
$ PURGE/KEEP=1 'ERROR'
不确定为什么你有读循环。你会得到的是文件中的最后一行,但假设这就是你想要的。