CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Аватара пользователя
papacoca

CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение papacoca »

Есть текстовый файл 1.txt в котором записаны 2 числа (число 1 и число 2) в один ряд через пробел, берем за пример: 31 5

1) Если хоть одного из числа 1 и числа 2 нет в перечне: 2, 5, 7, 15, 17, 19, 23, 31, 35 то выполнить скрипт заново.

2) Если число 1 и число 2 есть в списке чисел то выполнить скрипт далее.

3) Переименовать 1.txt в 2.txt.

4) Новый созданный 1.txt сравнить с 2.txt - 1 число с 1 числом и 2 число с 2 числом, если хоть одно различие то выполнить скрипт далее.
Аватара пользователя
megaloman

Re: CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение megaloman »

Если надо идентичность файлов

[spoiler]

Код: Выделить всё

@Echo Off
Cls
	Set "FileIn=Z:\Soft_In\1.txt"
	Set "FileOut=Z:\Soft_In\2.txt"
	Set "Reestr=2, 5, 7, 15, 17, 19, 23, 31, 35"
	Set /A Tsec=10
	Set "SR=="
	For %%i In (%Reestr%) Do Call Set "SR=%%SR%%%%i="
	:Begin1
		Call :NoFile "%FileIn%" %Tsec% ||GoTo :Begin1
		3<"%FileIn%" (Set /p SIn=<&3)
		Call :Found "%SIn%" "%SR%" %Tsec% ||GoTo :Begin1
		>nul Move /Y "%FileIn%" "%FileOut%"
		Set "SInNew=%SIn%"
	:Begin2
		Call :NoFile "%FileIn%" %Tsec% ||GoTo :Begin2
	3<"%FileIn%" (Set /p SInNew=<&3)
	If     "%SInNew%"=="%SIn%" Echo +++ Файлы "%FileIn%" "%FileOut%" одинаковые. Что дальше - не знаю :) &Pause &Exit /b 0
	If Not "%SInNew%"=="%SIn%" Echo --- Файлы "%FileIn%" "%FileOut%" разные.     Что дальше - не знаю :) &Pause &Exit /b 1
GoTo :Eof
:NoFile
	If Not Exist %1 (
		Echo --- Нет файла %1
		Timeout /T %~2
		Exit /B 1 &Rem Файла нет
	)
Exit /B 0
:Found
	For %%i In (%~1) Do >Nul (Echo %~2|Find "=%%i=")||(
		Echo --- Нет %%i в реестре значений
		Timeout /T %~3
		Exit /B 1 &Rem Что-то не найдено в реестре значений
	)
Exit /B 0
[/spoiler]



Если надо одинаковые числа в файлах вне зависимости от порядка

[spoiler]Заменить выделенный кусок предыдущего кода

Код: Выделить всё

:Begin2
		Call :NoFile "%FileIn%" %Tsec% ||GoTo :Begin2
	Set "SRnew=="
	For %%i In (%SIn%) Do Call Set "SRnew=%%SRnew%%%%i="
	3<"%FileIn%" (Set /p SInNew=<&3)
	Call :Found "%SInNew%" "%SRnew%" 0
	If     "%ErrorLevel%"=="0" Echo +++ В файлах "%FileIn%" "%FileOut%" одинаковые числа. Что дальше - не знаю :) &Pause &Exit /b 0
	If Not "%ErrorLevel%"=="0" Echo --- В файлах "%FileIn%" "%FileOut%" числа отличаются. Что дальше - не знаю :) &Pause &Exit /b 1
[/spoiler]
Я сделал таймаут (у меня 10 сек) для ожидания 1 файла, если его нет или если значения не содержатся в реестре.
Аватара пользователя
papacoca

Re: CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение papacoca »

Тогда опишите саму задачу, а не выбранное решение.
Аватара пользователя
YuS_2

Re: CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение YuS_2 »

Цитата YuS_2:



вот решение, на Ваш алгоритм:
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




Благодарю за проделанную работу, спасибо.



Одно уточнение!

В 3) пункте: Пишет, Переименовываем [1.txt] в [2.txt] Файл [2.txt] уже существует.

Не может переименовать [1.txt] в [2.txt] потому что он существует.



Можно сделать, чтоб без лишних запросов, удалить 2.txt и переименовать 1.txt в 2.txt, автоматом нужно?

Так как 2.txt будет постоянно создан его нужно удалить перед тем как переименовать 1.txt
Аватара пользователя
papacoca

Re: CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение papacoca »

Цитата papacoca:



Не может переименовать [1.txt] в [2.txt] потому что он существует.
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




Ну, так в Вашем алгоритме и нет никаких условий на такую ситуацию Изображение




Цитата papacoca:



Можно сделать, чтоб без лишних запросов, удалить 2.txt и переименовать 1.txt в 2.txt, автоматом нужно?
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




Можно, конечно, но попытайтесь это сделать самостоятельно, это несложно.

Подсказка:

Редактировать надо вот этот условный блок:



Код:

Код: Выделить всё

if not exist "%file2%" (ren "%file1%" "%file2%") else (
	echo.Файл [%file2%] уже существует. Требуется принятие решения. Выходим.
	pause&exit /b
)

надо заменить проверку на существование файла с ложного, на истинный и добавить перед переименованием команду удаления файла...

Либо, вместо добавления команды удаления, можно просто заменить команду переименования на команду перемещения - move с ключом /y, а условный блок вообще убрать, оставить только одну команду move

В помощь:



Код:

Код: Выделить всё

if /?
move /?
del /?
ren /?
pause /?
exit ?
Аватара пользователя
YuS_2

Re: CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение YuS_2 »

Цитата YuS_2:



Ну, так в Вашем алгоритме и нет никаких условий на такую ситуацию
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




Совершенно точно, сделаю.



Можете немного пояснить, если файлы идентичны вместо этого прописать 1 сценарий?

Код:

Код: Выделить всё

(echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b)

Если файлы отличаются то нужно прописывать после этого 2 сценарий?

Код:

Код: Выделить всё

echo.Приехали! Станция "Конечная".


Цитата:



>nul fc "%file1%" "%file2%"&&(echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b)

echo.Файлы отличаются, поехали дальше...

echo.Приехали! Станция "Конечная".
Аватара пользователя
papacoca

Re: CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение papacoca »

Цитата papacoca:



если файлы идентичны вместо этого прописать 1 сценарий?
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов





Цитата YuS_2:



(echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b)
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




Да, здесь можно прописать доп.сценарий, либо организовать переход на метку, которую поместить надо после строк сценария, который должен выполняться при различных файлах.

Т.е. примерно так:



Код:

Код: Выделить всё

...
>nul fc "%file1%" "%file2%"&&(echo.Файлы идентичны&goto next2)
echo.Файлы отличаются, поехали дальше...
echo.Приехали! Станция "Конечная".
pause&exit /b
:next2
echo.здесь выполняем код, если файлы одинаковые.
pause&exit /b


Цитата papacoca:



Если файлы отличаются то нужно прописывать после этого 2 сценарий?
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




Вместо этих двух строк:


Цитата YuS_2:



echo.Файлы отличаются, поехали дальше...

echo.Приехали! Станция "Конечная".
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




можно писать какой угодно сценарий...
Аватара пользователя
YuS_2

Re: CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов

Сообщение YuS_2 »

Цитата Iska:



Тогда опишите саму задачу, а не выбранное решение.
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов




papacoca, очень веское замечание и даже пытаясь выполнить требуемое, натыкаешься или на недомолвку или несоответствие. Запускать похоже надо планировщиком и желательно по контролю появления "1.txt". В моем коде он всегда удаляется для освобождения места для нового и если echo (предохранитель) в if-ах не убирать, то видны все варианты при разных сочетаниях соответствия файлов и перечня. Да, еще, для сравнения фалов использовал ту же методику что и с перечнем на тот случай если в файле "1.txt" будет строка: 31 5, а в файле "2.txt" будет строка: 5 31, то в моем случае такие файлы будут считаться равными по содержанию (fc выдаст ошибку по errorlevel), если такого быть не может или это должно быть отличием, то fc использовать допустимо.

Код: Выделить всё

@echo off
set "f1=1.txt"
set "f2=2.txt"
set "pr=2, 5, 7, 15, 17, 19, 23, 31, 35"
if not exist "%f1%" (echo No "%f1%"& pause& exit) else (<"%f1%" set /p z1=)
if exist "%f2%" <"%f2%" set /p z2=
for %%a in (%z2%) do echo %%a|>nul findstr "%z1%" || set x2=%%a
for %%a in (%z1%) do echo %%a|>nul findstr "%pr:,=%" || set x1=%%a
if not defined x2 (
 echo Отличий в файлах нет, удаляем "%f2%" и переименовываем "%f1%" в "%f2%"& echo del "%f2%"& echo ren "%f1%" "%f2%"
) else (
 if not defined x1 (
  echo Оба числа есть в перечне, удаляем "%f2%" и переименовываем "%f1%" в "%f2%"& echo del "%f2%"& echo ren "%f1%" "%f2%"
 ) else (
  echo Одного или двух чисел нет в перечне, удаляем "%f2%" и переименовываем "%f1%" в "%f2%"& echo del "%f2%"& echo ren "%f1%" "%f2%"
 )
)
pause
Ответить

Вернуться в «Скриптовые языки администрирования Windows»