Компьютерный форум 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=181772)

Kobzar 30-07-2010 15:09 1463587

сравнение списка файлов!
 
Прошу помочь!
Есть два файла
1.txt и 2.txt
допустим в первом:

1.пиво
2.кружка

Во втором:

1.пиво
2.кружка
3.вотка

Задача сравнить ети два файла и получить из них разницу в виде "3.вотка"
То есть идея в чем, есть директория в которую будут добавляться периодически файлы над которыми должны выполнятся действия. при появлении будет выполнянтся команда dir сравнивать с предыдущим выводом этой команды или еталонным и получив список новых файлов куда то их копировать !
Спасибо !

NiOl 30-07-2010 16:06 1463625

Предлагаю не решать "влоб" Ваш вопрос, а заменить его в соотвествии с описанием задачи и таким образов свести решение к тому, что уже обсуждалось в этой ветке:
1. Есть каталог, где появляются новые, не обработанные файлы.
2. Некая часть скрипта (которую Вы пишете самостоятельно) выполняет некие действия над очередным файлом и помечает в логе, что файл уже обработан. Файлы, запись о которых уже есть в логе (даже не просто есть , а с пометкой "Ок") обрабатываться уже не будут.

Как Вам такой вариант?

если "сойдет", то вот, легкая модификация того, что здесь уже было:
Код:

@Echo off
SetLocal EnableExtensions

Set WorkDir=.\
Set Mask=*.*
Set GoodCondition=[Ok]
Set BadCondition=[fail]

set Log=%~dpn0.log


pushd %WorkDir%
for /f "tokens=1* delims=" %%F in ('dir /a-d /b /on %Mask%') do call :CheckLog "%%F"
popd
exit

:CheckLog
set File=%~1
for /f "tokens=* delims=" %%S in ('findstr /C:"%File%" %log% ^| findstr /C:"%GoodCondition%"') do exit /b
set Status=%GoodCondition%
rem Делаем что-нить полезное с файлом %File%, находящемся в текущем каталоге

Copy %File% nul

rem В случае, если обработка файла кончилась неудачно - обязательно смените "Status" на "неудачный"!!!
if Errorlevel 1 set Status=%BadCondition%

rem Кидаем пометку в лог
set tm=%time::=-%
set tm=%date:~6,4%-%date:~3,2%-%date:~0,2%_%tm:~0,-3%
echo %tm%:        %Status%        %File%>>%Log%
exit /b


deepred 30-07-2010 16:21 1463634

Kobzar,

Код:

Echo off & Chcp 1251

set $SRC1="F:\1.txt" & rem файл-эталон
set $SRC2="F:\2.txt"

for /f %%a in ('Type "%$SRC2%"') Do (
(Find /i "%%a" %$SRC1% > nul)||Echo %%a)
pause

если заменить "Echo %%a" на "Echo %%a 1>> Change.log", то все
отличия будут содержаться в файле Change.log

gora 30-07-2010 16:21 1463635

Цитата:

Цитата Kobzar
Задача сравнить ети два файла и получить из них разницу »

Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Сравниваемые списки
Set lst1=1.txt
Set lst2=2.txt
:: Список отличий
Set diflst=3.txt

(For /F "tokens=* usebackq" %%i In ("%lst1%") Do (
        Set fl=0
        For /F "tokens=* usebackq" %%k In ("%lst2%") Do If %%i==%%k Set fl=1
        If !fl!==0 Echo %%i
)
For /F "tokens=* usebackq" %%i In ("%lst2%") Do (
        Set fl=0
        For /F "tokens=* usebackq" %%k In ("%lst1%") Do If %%i==%%k Set fl=1
        If !fl!==0 Echo %%i
))>"%diflst%"


Kobzar 30-07-2010 16:28 1463642

спасибо ! тема закрыта !

gora 30-07-2010 17:27 1463669

deepred, если уникальные строки будут в обоих файлах, то в Вашем варианте будут выведены уникальные строки только из второго файла.

deepred 30-07-2010 19:30 1463756

gora,

Цитата:

Цитата gora
если уникальные строки будут в обоих файлах »

Это не соответсвует условию задачи
Цитата:

Цитата Kobzar
сравнивать с предыдущим выводом этой команды или еталонным и получив список новых файлов »

но тем не менее....
Код:

Echo off & Chcp 1251 & Cls

set $SRC1="F:\1.txt"  & set $SRC2="F:\2.txt"    & call :action
set $SRC1=%$SRC1:1=2%  & set $SRC2=%$SRC1:2=1%  & call :action
pause & goto :Eof

:action
for /f %%a in ('Type "%$SRC2%"') Do (
(Find /i "%%a" %$SRC1% > nul)||Echo %%a 1>> Change.log)


LAKERS824 06-07-2012 19:30 1947251

а если не различия, а схождения надо найти?


Время: 07:20.

Время: 07:20.
© OSzone.net 2001-