Scripting 如何在DCL——OpenVMS脚本中编辑输出文本

Scripting 如何在DCL——OpenVMS脚本中编辑输出文本,scripting,openvms,dcl,Scripting,Openvms,Dcl,我编写了下面的代码,它将提取目录名和文件名,并对提取的文本使用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

我编写了下面的代码,它将提取目录名和文件名,并对提取的文本使用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
任何建议-如何从输出中删除版本号


我无法使用目录的确切长度,因为目录长度每次都会变化….:

虽然哈博对此进行了解释,但还有一些解释

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

a=f$searchsys$manager:net$server.log

然后我发现它存在

wr系统$a输出

显示

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

在f$parse的帮助下,我得到了

帮助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$parsea、、设备

显示

SYS$SYSROOT:

而且

wr sys$output f$parsea,,,目录

所以我明白了

[系统管理员]

wr sys$output f$parsea、、名称

显示

净$SERVER

wr sys$output f$parsea、、类型

显示

.日志

版本是

wr sys$output f$parsea、、版本

显示为

);九,

词典功能非常方便,请使用

帮助词汇

它表明

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$消息F$模式F$多路径F$解析F$PID F$权限F$进程F$读取链接F$搜索
F$SETPRV F$STRING F$SYMLINK_属性F$TIME F$TRNLNM F$TYPE F$UNIQUE F$USER

虽然哈博对此进行了解释,但还有一些解释

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

a=f$searchsys$manager:net$server.log

然后我发现它存在

wr系统$a输出

显示

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

在f$parse的帮助下,我得到了

帮助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$parsea、、设备

显示

SYS$SYSROOT:

而且

wr sys$output f$parsea,,,目录

所以我明白了

[系统管理员]

wr sys$output f$parsea、、名称

显示

净$SERVER

wr sys$output f$parsea、、类型

显示

.日志

版本是

wr sys$output f$parsea、、版本

显示为

);九,

词典功能非常方便,请使用

帮助词汇

它表明

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$消息F$模式F$多路径F$解析F$PID F$权限F$进程F$读取链接F$搜索
F$SETPRV F$STRING F$SYMLINK_属性F$TIME F$TRNLNM F$TYPE F$UNIQUE F$USER

带有F$ELEMENT 0的答案;,正如所确认的那样,ABCD应该可以工作。我可能会编写这样的脚本:

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

不知道为什么会有读循环。您将得到的是文件中的最后一行,但假设这是您想要的。

使用F$ELEMENT 0的答案;,正如所确认的那样,ABCD应该可以工作。我可能会编写这样的脚本:

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

不知道为什么会有读循环。您将得到文件中的最后一行,但假设这是您想要的。

用于提取文件规范的适当部分。或f$元素以获取分号之前的部分。版本可以用分号或点分隔。悄悄的或f$locate来获取分号的位置,以便与f$extract.Hi Habo一起使用。您能告诉我在这种情况下如何使用f$ELEMENT或f$PARSE吗?它看起来像f$eleme
新台币0;,ABCD应返回分号之前的所有内容。我现在手头没有一个实时的VMS系统。IIRC,写入Sys$Output'f$元素0;,ABCD'将向您显示结果。谢谢您。。它对我有用:::::FWIW:$error\u no\u version=f$parseerror,,,device+f$parseerror,,,directory+f$parseerror,,,,name+f$parseerror,,,typeUse用于提取文件规范的适当部分。或f$元素以获取分号之前的部分。版本可以用分号或点分隔。悄悄的或f$locate获取分号的位置,以便与f$extract.Hi Habo一起使用。您能告诉我如何使用f$ELEMENT或f$PARSE吗?在这种情况下…它看起来像f$ELEMENT 0;,ABCD应返回分号之前的所有内容。我现在手头没有一个实时的VMS系统。IIRC,写入Sys$Output'f$元素0;,ABCD'将向您显示结果。谢谢您。。它对我有用:::::FWIW:$error\u no\u version=f$parseerror,,,device+f$parseerror,,,directory+f$parseerror,,,name+f$parseerror,,,type