Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Функция сравнения и копирования

Ответить
Настройки темы
CMD/BAT - Функция сравнения и копирования

Новый участник


Сообщения: 11
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток!

Такая задача:
в папке (допустим folder) имеется файлы (например с расширением .bat & .txt) с одинаковыми именами, необходимо файлы с одинаковыми именами (т.е. 1.txt и 1.bat) перенести в другую папку (допустим folder_to), а те файлы которые, у которых не найдётся "родственной души" остались не тронутыми.

Что было предпринято:
пытался задать две переменные, а вот как их сравнить - я не имею не единого понятия. Может конвеер надо организовать?

*********************************************
@echo off

cd C:\Users\Z\Desktop\test\test1\

set var=
set /p var="Vvod: "

for %%i in (%var%.txt) do (echo %%i)
for %%e in (%var%.bat) do (echo %%e)
:set1

set /p var1="Comand: "
%var1%
goto :set1

pause
*********************************************

Отправлено: 12:04, 27-12-2016

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Попробуйте так (не проверялось):
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=c:\Folder
set sDestFolder=c:\folder_to

if exist "%sSourceFolder%\." (
	if exist "%sDestFolder%\." (
		for /f "usebackq delims=" %%i in (
			`2^>nul dir /b /a:-d "%sSourceFolder%\*.bat"`
		) do if exist "%sSourceFolder%\%~ni.txt" (
			echo move "%sSourceFolder%\%~i" "%sDestFolder%\"
			echo move "%sSourceFolder%\%~ni.txt" "%sDestFolder%\"
		)
	) else (
		echo Can't find destination folder [%sDestFolder%].
		exit /b 2
	)
) else (
	echo Can't find source folder [%sSourceFolder%].
	exit /b 1
)

endlocal
exit /b 0

Для реального применения уберите echo.

Отправлено: 13:39, 27-12-2016 | #2



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

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


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Попробуйте, проверялось :)
Код: Выделить весь код
@Echo Off

Set  "InBox=Z:\Box_In"
Set "OutBox=Z:\Box_Out"

FOR /F "usebackq delims=" %%f IN (`Dir "%InBox%\*.*" /B /A:-D /O:N 2^>nul`) DO (
	If Exist "%InBox%\%%f" (
		FOR /F "usebackq skip=1 delims=" %%i IN (`Dir "%InBox%\%%~nf.*" /B /A:-D /O:N 2^>nul`) DO (
			If Exist "%InBox%\%%i" Move /Y "%InBox%\%%~nf.*" "%OutBox%\" >nul
		)
	)
)
Идея решения: во внешнем цикле получаем список файлов командой Dir, во внутреннем цикле для каждого полученного имени получаем снова список файлов полученного имени для всех расширений с пропуском первого. Если файл с полученным именем один, то внутренний цикл не работает, иначе переносятся все файлы с полученным именем для всех расширений.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 27-12-2016 в 16:02.


Отправлено: 15:50, 27-12-2016 | #3


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@echo off
set "di=papka_in"
set "do=papka_out"
for /f "delims=" %%a in ('2^>nul dir/a-d/b "%di%"') do set/a "$_%%~na+=1"
for /f "tokens=2* delims=_=" %%a in ('set $_') do if %%b gtr 1 >nul move/y "%di%\%%a.*" "%do%\"
exit

Отправлено: 17:42, 27-12-2016 | #4


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


«Все работы хороши, выбирай на вкус»™ .

megaloman, а зачем здесь:
Цитата megaloman:
If Exist "%InBox%\%%f" ( »
проверять существование файла? Он ведь в любом случае существует, поскольку получен посредством dir.

Последний раз редактировалось Iska, 27-12-2016 в 18:33. Причина: Вопрос снят, см. ниже


Отправлено: 18:00, 27-12-2016 | #5


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Iska, Я не очень понимаю, как работает команда For+Dir. Когда-то очень давно у меня создалось впечатление, что результат выполнения Dir из-под For попадает в некий буфер, и For уже берёт список файлов из этого буфера, а не из реального наличия файла, если по какой-то причине файлы успели удалиться, как здесь, то можно впасть в ошибку. Поэтому я перестраховываюсь. Возможно, это ересь и я не прав. На моём тестовом примере после удаления этого If ничего не изменилось.

alpap,
Цитата:
тра ля ля
тра ля ля.bat
тра ля ля.dfx
тра ля ля.doc
тра ля ля.txt
тра ля ля.xls
Для этих файлов ваш алгоритм не работает.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:15, 27-12-2016 | #6


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата megaloman:
что результат выполнения Dir из-под For попадает в некий буфер, и For уже берёт список файлов из этого буфера »
Именно так. Как раз для того и делают цикл разбора по for /f, если внутри цикла перебора for количество файлов может измениться.

А! Понял, дошло: Вы ведь перебираете именно все файлы, а я перебирал только по маске *.bat. Вопрос снимается.

Отправлено: 18:32, 27-12-2016 | #7


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Для этих файлов ваш алгоритм не работает »
Да, пробел недопустим, разве тогда так, проверил на разных именах и сочетаниях:
Код: Выделить весь код
@echo off
set "di=papka_in"
set "do=papka_out"
for /f "delims=" %%a in ('2^>nul dir/a-d/b "%di%"') do set "name=%%~na"& call set/a "$:%%name: =_%%+=1"
for /f "tokens=2* delims=:=" %%a in ('set $:') do set "name=%%a"& if %%b gtr 1 cmd/v/c move/y "%di%\!name:_= !.*" "%do%\"
exit

Отправлено: 23:18, 27-12-2016 | #8


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


alpap,
Для этих файлов ваш алгоритм не работает.
Цитата:
Ку,ку.
Ку,ку.bat
Ку,ку.dfx
Ку,ку.doc
Ку,ку.txt
Ку,ку.xls
Вы чародей, я с восторгом иной раз разбираю идеи Ваших решений. Я делаю всё прямолинейнее и тупее. Поэтому пристрастно отнёсся к этому Вашему коду. Хотя, наверное, можно всегда подобрать данные, способные одурачить любую программу

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-12-2016 в 00:52.


Отправлено: 00:28, 28-12-2016 | #9


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Этому варианту что помешает?
Код: Выделить весь код
@echo off
set "di=papka_in"
set "do=papka_out"
for /f "delims=" %%a in ('2^>nul dir/a-d/b "%di%"') do 2>nul dir/a-d/b "%di%\%%~na.*"|>nul find/v "%%~xa" && if exist "%di%\%%a" >nul move/y "%di%\%%~na.*" "%do%\"
exit

Отправлено: 02:57, 28-12-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Функция сравнения и копирования

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Батник для сравнения файлов orgia Скриптовые языки администрирования Windows 31 02-04-2013 14:01
В Windows 8 появится функция резервного копирования History Vault OSZone News Новости и события Microsoft 5 05-04-2011 16:32
CMD/BAT - [решено] Команда копирования файла с указанием времени копирования Pozia Скриптовые языки администрирования Windows 6 16-10-2010 04:27
Программа для поточечного сравнения изображений ShaRP Программное обеспечение Windows 6 14-02-2008 08:51
Алгоритм сравнения бинарных файлов Savant Программирование и базы данных 2 04-05-2005 09:57




 
Переход