Войти

Показать полную графическую версию : Проверка наличия нескольких строк в файле


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

Iska
31-08-2014, 01:07
Упакуйте в архив образец файла «baselist.cfg» и выложите.

V!RTuE
31-08-2014, 01:19
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
@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
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
@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
Появился еще один вопрос. как, например, в этой строке кода
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
А если нет ни ROS, ни LAW, то записать в файл "Отсутствует: ROS или LAW" »


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



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

А если нет ни 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
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
поставить знак, заменяющий только цифры »


@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
Код:
@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"




© OSzone.net 2001-2012