OpenVMS - УДАЛИТЬ строку, если ТЕКСТ, как х
У меня есть пакетный скрипт, который записывает все файлы, включая путь и номер версии, в файл TMP для физического устройства. Затем этот пакетный сценарий записывает любые строки, которые показывают номер версии файла, превышающий предоставленную переменную.
DIRECTORYX := DIRECTORY /NODATE /NOHEADING /NOTRAILING
DIR_OUTPUT_FILENAME = "TOPAS$UTILLOG:" + F$UNIQUE() + ".TMP"
DEVICE = $1$DGA1112
DIRECTORYX 'DEVICE':[000000...]*.*;* /NOSIZE /OUTPUT='DIR_OUTPUT_FILENAME'
В то же время у меня есть файлы, на которые я не заинтересован, чтобы мне сообщали. В этом случае я хочу удалить все строки, которые могут содержать это имя файла (filename.ext;), из его файла TMP, чтобы пакетный сценарий мог продолжить работу через него, и только те файлы отчетов, которые я не хочу полностью игнорировать, хотят игнорировать.
Как бы я начал читать файл, находясь внутри цикла, используя 'IGNORE_FILE' в качестве переменной для текстовой строки для сопоставления и удаления связанной строки текста, чтобы при выполнении моего пакетного сценария через файл он не сообщал о файлах, запрошенных для игнорируются.
Большое спасибо за любую помощь
2 ответа
Хорошо... Теперь я вижу, откуда ты.
Как бы я написал все от 7-го до конца строки?
Ну, вы можете просто зацикливаться, начиная с i=7, или вы можете использовать "кавычку" в строке и использовать кавычку в качестве нового разделителя. Вот пример с обоими, используя двойные кавычки в качестве почти естественного выбора второго разделителя
$
$ READ SYS$INPUT BUFF
SHG101,$1$DGA1101:,25,15,10,5000,100,X.TMP,Y.DAT
$
$ excludes = ""
$ tmp = F$ELEMENT(7, ",", BUFF)
$ IF tmp.NES.","
$ THEN
$ i = 8
$ excludes = tmp
$exclude_loop:
$ tmp = F$ELEMENT(i, ",", BUFF)
$ IF tmp.NES.","
$ THEN
$ excludes = excludes + "," + tmp
$ i = i + 1
$ GOTO exclude_loop
$ ENDIF
$ excludes = "/EXCLUDE=(" + excludes + ")"
$ ENDIF
$
$ SHOW SYMB excludes
$
$! Using a different delimitor:
$ READ SYS$INPUT BUFF
SHG101,$1$DGA1101:,25,15,10,5000,100,"X.TMP,Y.DAT"
$
$ excludes = ""
$ tmp = F$ELEMENT(1, """", BUFF)
$ IF tmp.NES."," THEN excludes = "/EXCLUDE=(" + tmp + ")"
$
$ SHOW SYMB excludes
В коде мы видим:Проверка ''DEVICE'на наличие больших версий файлов (>=;''HVERNO') - может занять некоторое время...>
Я призываю вас проверить DFU Большой код цикла "READ FH3 / END_OF_FILE = LABEL $ _EOF_DIRLIST1 BUFF2..." упростит:
dfu searc/versio=min=200'excludes'form="!AS"/out=tmp.tmp dka0:
Это будет выполняться в считанные секунды почти независимо от того, сколько файлов. Бросьте все предупреждение, включите его, всегда проверяя на 32000, поскольку это (почти) бесплатно. После выполнения команды DFU создайте вывод 'fancy', если tmp.tmp не пуст, создав свой заголовок и добавив tmp.tmp. Всегда удаляйте tmp.tmp ($ CLOSE/DISP=DELETE)
Бесплатный совет...
Эти 15 глубоко вложенных IF-THEN-ELSE-ENDIF для получения сообщения выглядят ужасно (для поддержания). Рассматривать поиск в массиве?! Вот отработанный пример:
$! prep for test
$ EL = p1
$ EL_DIAG = "FILE.DAT"
$ LOCAL_STATUS = "12345"
$
$! Code snippet to be tested
$
$ x = 'EL'
$ ! Fold multiple conditions into 1 message
$
$ if (EL .EQ. 7) .OR. (EL .EQ. 14) .OR. (EL .EQ. 21) .OR. (EL .EQ. 25) -
.OR. (EL .EQ. 29) .OR. (EL .EQ. 30) THEN x = "L1"
$
$ MSG_6 = "error opening " + EL_DIAG + " for WRITE (RM=" + LOCAL_STATUS + ")"
$ IDT_6 = "OPENIN"
$ MSG_L1 = "error reading from " + EL_DIAG + " (RM=" + LOCAL_STATUS + ")"
$ IDT_L1 = "READERR"
$ MSG_8 = "device name missing " + EL_DIAG
$ IDT_8 = "DNNF"
$
$ ! Pick up the required texts
$
$ IF F$TYPE(MSG_'x').EQS.""
$ THEN
$ WRITE SYS$OUTPUT "No message found for code: ", EL
$ EXIT 16
$ ENDIF
$
$ MSG = MSG_'x
$ IDTXT = IDT_'x
$
$ WRITE SYS$OUTPUT "MSG : ", MSG
$ WRITE SYS$OUTPUT "IDTXT: ", IDTXT
Ура, Хейн
Оба комментария - отличное начало. Проверьте их внимательно. Какая версия OpenVMS? Что-то из последних двух десятилетий?
Просто возьмите и используйте DFU!
$ define/user sys$output nl:
$ mcr dfu searc/versio=min=200/excl=(*.dat,*.tmp)/form="!AS"/out=tmp.tmp dka0:
$ type tmp.tmp
BUNDY$DKA0:[SYS0.SYSMGR]OPERATOR.LOG;242
BUNDY$DKA0:[SYS0.SYSMGR]ACME$SERVER.LOG;241
BUNDY$DKA0:[SYS0.SYSMGR]LAN$ACP.LOG;241
Вы также можете рассмотреть возможность вставки F$SEARCH в цикл и анализа версии и других интересных компонентов для реализации исключений....
$
$ type SEARCH_HIGH_VERSION.COM
$ max = 200
$ old = ""
$ IF p1.EQS."" THEN EXIT 16 ! PARAM
$loop:
$ file = F$SEARC(p1)
$ IF file.EQS."" THEN EXIT 99018 ! NMF
$ IF file.EQS.old THEN EXIT 100164 ! Not wild
$ old = file
$ version = F$PARSE(file,,,"VERSION") - ";"
$ IF max.GE.'version' THEN GOTO loop
$ ! IF ... further string tests
$ WRITE SYS$OUTPUT file
$ GOTO LOOP
$
$ @SEARCH_HIGH_VERSION.COM *.*;*
SYS$SYSROOT:[SYSMGR]ACME$SERVER.LOG;241
SYS$SYSROOT:[SYSMGR]LAN$ACP.LOG;241
SYS$SYSROOT:[SYSMGR]OPERATOR.LOG;242
SYS$SYSROOT:[SYSMGR]TMP.TMP;304
SYS$SYSROOT:[SYSMGR]TMP.TMP;303
SYS$SYSROOT:[SYSMGR]TMP.TMP;302
SYS$SYSROOT:[SYSMGR]TMP.TMP;301
SYS$SYSROOT:[SYSMGR]TMP.TMP;300
%RMS-E-NMF, no more files found
$
$ @SEARCH_HIGH_VERSION.COM tmp.tmp
SYS$SYSROOT:[SYSMGR]TMP.TMP;304
%RMS-F-WLD, invalid wildcard operation
$
DFU, вероятно, будет на 10* быстрее, чем DIR DIR будет на 10* быстрее, чем F$SEARCH, но вы потеряете это при обработке.
Удачи! Hein