Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проверка наличия нескольких строк в файле (http://forum.oszone.net/showthread.php?t=287270)

V!RTuE 31-08-2014 00:58 2396448

Проверка наличия нескольких строк в файле
 
Задача следующая. Если есть файл, например, MBP*.din, то проверить baselist.cfg на наличие строк (ROS, BRB, BVV, BVS, PKP, PKS и может быть еще около десятка). Если же строка начинается с ; то ее игнорировать. Если же в baselist.cfg отсутствует какая-то строка, то записать в файл proverka.txt все отсутствующие строки (Отсутствует: %название_строки%). Помогите как это реализовать

Iska 31-08-2014 01:07 2396450

Упакуйте в архив образец файла «baselist.cfg» и выложите.

V!RTuE 31-08-2014 01:19 2396452

Вложений: 1
Iska, Файл 116549 ну вот собс-но и содержимое
Код:

ROS
BRB
BVV
;BVS
PKP
PKS
;PDR
LAW

Проверяем этот файл на наличие строк (ROS, BRB, BVV, BVS, BZS, PKP, PKS, PDR). По итогам проверки должен выдать, что BVS и PDR отсутствуют (т.к. в начале стоит ; ), а также отсутствует BZS. Другие строки игнорируем (тот же LAW)

Georgio 31-08-2014 06:39 2396475

Код:

@echo off
if exist "MBP*.din" (
 for %%i in (ROS, BRB, BVV, BVS, BZS, PKP, PKS, PDR) do (
  findstr /ilx %%i "baselist.cfg">nul|| (
  echo Отсутствует: %%i
  )
  )
 )>"proverka.txt"
exit /b


V!RTuE 31-08-2014 17:13 2396636

Georgio, спасибо. работает. Но возник еще один вопрос. Таких вот *.din-файлов может быть около 100 штук. И для каждого din определенный список баз (которые должны быть в baselist.cfg). Можно конечно же 100 раз написать конструкцию if exist... , но может как-то можно оптимизировать код?
Например задав сначала:
Код:

set MBP*.din=ROS, BRB, BVV, BVS, BZS, PKP, PKS, PDR
set LAW*.din=LAW, DOF
set PAP*.din=PAP
и т.д.

т.е. завести в переменные каждый din и соответствующие ему базы в baselist.cfg
а после использовать одну конструкцию типа: если есть такой-то дин,то ищем соответствия в baselist.cfg

Georgio 31-08-2014 18:50 2396674

Код:

@echo off& ::Команда "echo off" обязательна!

set $MBP*.din=ROS, BRB, BVV, BVS, BZS, PKP, PKS, PDR
set $LAW*.din=LAW, DOF
set $PAP*.din=PAP
::::::::::::::::::::::и т.д.:::::::::::::::::::::::

(
for /f "tokens=1,2 delims=$=" %%i in ('
 set $
') do (
 if exist "%%i" (
  for %%k in (%%j) do (
  findstr /ilx %%k "baselist.cfg">nul|| (
  echo Отсутствует: %%k
  )
  )
  )
 )
)>"proverka.txt"

exit /b


V!RTuE 01-09-2014 05:08 2396832

Появился еще один вопрос. как, например, в этой строке кода
Код:

set $MBP*.din=ROS, BRB, BVV, BVS, BZS, PKP, PKS, PDR
добавить условие для строки ROS. Т.е. проверить есть ли ROS или LAW. Т.е. если есть ROS, но нет LAW, то всё ок. И если есть LAW, но нет ROS, то тоже всё ок. А если нет ни ROS, ни LAW, то записать в файл "Отсутствует: ROS или LAW"
так не работает:
Код:

set $MBP*.din=ROS LAW, BRB, BVV, BVS, BZS, PKP, PKS, PDR

Georgio 01-09-2014 07:41 2396840

Цитата:

Цитата V!RTuE
А если нет ни ROS, ни LAW, то записать в файл "Отсутствует: ROS или LAW" »


Я понял, что Вы имели в виду: "А если нет ни ROS, ни LAW, то записать в файл "Отсутствуют: ROS и LAW"".



Цитата:

Цитата V!RTuE
проверить есть ли ROS или LAW. Т.е. если есть ROS, но нет LAW, то всё ок. И если есть LAW, но нет ROS, то тоже всё ок »

Цитата:

Цитата Georgio
А если нет ни ROS, ни LAW, то записать в файл "Отсутствуют: ROS и LAW" »


Код:

@echo off& ::Команда "echo off" обязательна!

set $MBP*.din="ROS и LAW", BRB, BVV, BVS, BZS, PKP, PKS, PDR
set $LAW*.din=LAW, DOF
set $PAP*.din=PAP
::::::::::::::::::::::и т.д.:::::::::::::::::::::::

(
for /f "tokens=1,2 delims=$=" %%i in ('
 set $
') do (
 if exist "%%i" (
  for %%k in (%%j) do (
  findstr /bil %%k "baselist.cfg">nul|| (
  echo Отсутствуют: %%~k
  )
  )
  )
 )
)>"proverka.txt"

exit /b


V!RTuE 03-09-2014 01:38 2397657

Georgio, спасибо, вы МЕГАМОЗГ!
еще появился вопрос. бывает, что названия din начинаются одинаково, например
Код:

set $%DIN%MED*.din=MED
set $%DIN%MEDR*.din="MEDR или MED"

и в случае если есть только MEDR*.din (для него нужна запись в baselist.cfg только MEDR), то выдаст сообщение что не хватает еще MED. Может есть способ чтобы вместо * (которая заменяет любой символ), поставить знак, заменяющий только цифры)? т.к. всегда после названия идут только цифры. Пока что придумал такой способ решения
Код:

set $%DIN%MED0*.din=MED
set $%DIN%MED1*.din=MED
set $%DIN%MED2*.din=MED
set $%DIN%MED3*.din=MED
set $%DIN%MED4*.din=MED
set $%DIN%MED5*.din=MED
set $%DIN%MED6*.din=MED
set $%DIN%MED7*.din=MED
set $%DIN%MED8*.din=MED
set $%DIN%MED9*.din=MED
set $%DIN%MEDR*.din="MEDR или MED"


Georgio 03-09-2014 10:04 2397716

Цитата:

Цитата V!RTuE
поставить знак, заменяющий только цифры »


Код:

@echo off& ::Команда "echo off" обязательна!

set $MBP*.din="ROS и LAW", BRB, BVV, BVS, BZS, PKP, PKS, PDR
set $LAW*.din=LAW, DOF
set $PAP*.din=PAP
set $MED*.din=MED
set $MEDR*.din=MEDR
::::::::::::::::::::::и т.д.:::::::::::::::::::::::

(
for /f "tokens=1,2,3 delims=$*=" %%h in ('
 set $
') do (
 dir /a-d/b "%%h*%%i"| findstr /eir "%%h[0-9]*\%%i">nul&& (
 for %%k in (%%j) do (
  findstr /bil %%k "baselist.cfg"| findstr /eil %%k>nul|| (
  echo Отсутствуют: %%~k
  )
  )
 )
 )
)>"proverka.txt"

exit /b


V!RTuE 08-09-2014 05:08 2399843

Цитата:

Цитата Georgio
Код:
@echo off& ::Команда "echo off" обязательна!
set $MBP*.din="ROS и LAW", BRB, BVV, BVS, BZS, PKP, PKS, PDR
set $LAW*.din=LAW, DOF
set $PAP*.din=PAP
set $MED*.din=MED
set $MEDR*.din=MEDR
::::::::::::::::::::::и т.д.:::::::::::::::::::::::
(
for /f "tokens=1,2,3 delims=$*=" %%h in ('
set $
') do (
dir /a-d/b "%%h*%%i"| findstr /eir "%%h[0-9]*\%%i">nul&& (
for %%k in (%%j) do (
findstr /bil %%k "baselist.cfg"| findstr /eil %%k>nul|| (
echo Отсутствуют: %%~k
)
)
)
)
)>"proverka.txt"
exit /b »

всё-таки не работает. Не пишет в файл об отсутствующих строках((
Код:

@echo off
SET f=%~dp0
SET DIN=%f%DISTR\DIN\

set $%DIN%LAW*.din=LAW, "EPB или EXP", "DOF или PAP", RGSS
set $%DIN%BUD*.din="RZB или LAW", "EPB или EXP", PBUN, QSBO, KRBO, PKBO, "DOF или PAP", PSG, PKG, RGSS, PPVS
set $%DIN%MBP*.din="ROS или LAW", PBI, "QSA или QUEST", PPN, PPS, PKV, "BRB или ARB", "BVV или AVV", "BVS или AVS", "BDV или ADV", "BZS или AZS", "BMS или AMS", "BPV или APV", "BSZ или ASZ", "BSK или ASK", "BUR или AUR", "BCN или ACN", CJI, CMB, PSP, PKS, PDR, PGU, PKP, PTS, PSG, "DOF или PAP", PKG, RGSS, PPVS
set $%DIN%BUDU*.din="RZB или LAW", PBUN, QSBO, "DOF или PAP", PKBO, RGSS
(
for /f "tokens=1,2,3 delims=$*=" %%h in ('
 set $
') do (
 dir /a-d/b "%%h*%%i"| findstr /eir "%%h[0-9]*\%%i">nul&& (
 for %%k in (%%j) do (
  findstr /bil %%k "%f%BASE\baselist.cfg"| findstr /eil %%k>nul|| (
  echo Отсутствуют: %%~k
  )
  )
 )
 )
)>>"%f%proverka.txt"



Время: 18:19.

Время: 18:19.
© OSzone.net 2001-