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

kelevara 26-04-2013 15:09 2139994

Поиск дублирующихся названий в двух каталогах
 
Добрый день!
Необходимо каталогах, которые задаются в качестве параметров скрипта, найти и вывести на экран имена повторяющихся файлов. При этом для проверки наличия файла во втором каталоге необходимо использовать только один оператор For и IF.

Ксеноинженер 26-04-2013 21:12 2140193

Считает все файлы, кроме скрытых и системных.
Код:

@echo off
set dir1=C:\
set dir2=D:\
CD /d %dir2%
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%dir1%"') DO (
IF EXIST "%%I" echo %%I
)
pause


kelevara 26-04-2013 21:13 2140194

Нашел схожий скрипт, но не выходит его изменить под свои нужды:

Код:

@echo off
for /f "tokens=*" %%i in ('dir /b /a-d "c:\lab2\1"') do if exist "c:\lab2\2\%%~nxi" echo %%~nxi
pause

1. Необходимо задать каталоги, в которых будет производиться поиск, с помощью параметров. Для этого делаю следующее:

Код:

@echo off
set directum1=c:\lab2\1
set directum2=c:\lab2\2
for /f "tokens=*" %%i in ('dir /b /a-d %directum1%') do if exist %directum2%+%%~nxi echo %%~nxi
pause

Но этот номер не проходит. Как быть?

2. Скрипт выводит только те файлы, у которых совпадает и разрешение и имя, а мне разрешение не важно, главное чтобы имя совпадало. Для этого в %%~nxi убираю х. Но это также не помогает...

Ксеноинженер, мм, а как сделать так, чтобы расширение не учитывалось при поиске?

Ксеноинженер 26-04-2013 21:19 2140203

kelevara, дело в скобках после DO.
Код:

@echo off
set dir1=C:\
set dir2=D:\
CD /d "%dir2%"
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%dir1%"') DO (
IF EXIST "%%~nI" echo %%~nI
)
pause

Вот так сравнивается только имя файла.

kelevara 28-04-2013 00:15 2140862

Цитата:

Цитата Ксеноинженер
kelevara, дело в скобках после DO.
Код:
@echo off
set dir1=C:\
set dir2=D:\
CD /d "%dir2%"
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%dir1%"') DO (
IF EXIST "%%~nI" echo %%~nI
)
pause
Вот так сравнивается только имя файла. »

Странно, этот вариант у меня вообще ничего не находит. У меня есть две папки 1 и 2. В папке 1 лежат файлы 1.txt, lab2-1.bat, lab2-2.bat, lab2-3.bat, lab2-4.bat, lab2-5.bat.
В папке 2 лежат файлы 1.bat, lab2-1.bat, lab2-3.bat, lab2-5.bat.
Соответственно, в результате работы программы на экран должен выводится следующий список:
1
lab2-1
lab2-3
lab2-5

К слову, предыдущий вариант скрипта, приведенный во втором сообщении, выводит такой список:
lab2-1.bat
lab2-3.bat
lab2-5.bat

Georgio 28-04-2013 01:53 2140900

Сообщение удалено автором.

Ксеноинженер 28-04-2013 02:20 2140904

Цитата kelevara:
Соответственно, в результате работы программы на экран должен выводится следующий список:
1
lab2-1
lab2-3
lab2-5 »


Так?
Код:

@echo off
set directum1=c:\lab2\1
set directum2=c:\lab2\2
CD /d "%directum2%"
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%directum1%"') DO (
IF EXIST %%~nI* echo %%~nI
)
pause


Georgio 28-04-2013 04:40 2140923

Ксеноинженер, я так тоже пробовал:
Цитата:

Цитата Ксеноинженер
IF EXIST %%~nI* echo %%~nI »

Точнее, так:
Код:

IF EXIST %%~nI.* echo %%~nI
Не подходит. Если, например, в %directum2% находится файл lab-2-1.###.bat вместо файла lab2-1.bat, то также будет выведено имя "lab2-1", а оно не должно выводиться, так как файла с таким именем нет.

kelevara 28-04-2013 18:49 2141230

Ксеноинженер, Georgio
Попробую показать вариант, предложенный уважаемым Ксеноинженером. Но проблему, указанную Georgio (тоже кстати не менее уважаемым), также признаю и беру к сведению =)

Ксеноинженер 29-04-2013 17:00 2141750

Цитата:

Цитата Georgio
Не подходит. Если, например, в %directum2% находится файл lab-2-1.###.bat вместо файла lab2-1.bat, то также будет выведено имя "lab2-1", а оно не должно выводиться, так как файла с таким именем нет. »

Georgio, Дисциплина задания kelevara не позволяет второго FOR. Если б позволяла, то было б так:
Код:

@echo off
set directum1=c:\lab2\1
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%directum1%"') DO (
echo %%~nI>>"%tmp%\list1.txt"
)
set directum2=c:\lab2\2
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%directum2%"') DO (
echo %%~nI>>"%tmp%\list2.txt"
)
findstr /i /x /G:"%tmp%\list1.txt" "%tmp%\list2.txt"
del /q "%tmp%\list1.txt"
del /q "%tmp%\list2.txt"
pause


Georgio 29-04-2013 17:15 2141757

Цитата:

Цитата Ксеноинженер
Дисциплина задания kelevara не позволяет второго FOR »

Ксеноинженер, да, это точно. Именно поэтому я удалил своё сообщение:
Цитата:

Цитата Georgio
Сообщение удалено автором. »

Цитата:

Цитата Georgio
Причина: Несоответствие условиям задачи »


Georgio 29-04-2013 23:18 2141973

Код:

@ECHO OFF

SET directum1=c:\lab2\1
SET directum2=c:\lab2\2

CALL :# %directum1% dir1.txt
CALL :# %directum2% dir2.txt
FINDSTR /I /X /G:dir1.txt dir2.txt
PAUSE
DEL dir1.txt dir2.txt
EXIT

:#
FOR /f "tokens=*" %%I in ('DIR /B /A-D %1') DO ECHO %%~nI>>%2
EXIT /B


Georgio 30-04-2013 15:06 2142314

Как бы еще обойтись без временных файлов?

Ксеноинженер 07-05-2013 23:03 2146261

Georgio,
Код:

@ECHO off
setlocal enabledelayedexpansion
SET directum1=c:\lab2\1
SET directum2=c:\lab2\2
CD "%directum2%"
FOR /f %%I IN ('DIR /b /a-d "%directum1%"') DO set dir1=!dir1! %%i
FOR /f %%J IN ('DIR /b /a-d "%directum2%"') DO (
        set dir1=!!dir1: %%J=""!!
        IF NOT ERRORLEVEL 1 ECHO %%~nJ
)
PAUSE



Время: 10:41.

Время: 10:41.
© OSzone.net 2001-