CMD/BAT - [решено] Скопировать из множества папок по одному самому новому файлу с переименованием.

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

Re: CMD/BAT - [решено] Скопировать из множества папок по одному самому новому файлу с переименованием.

Сообщение megaloman »

Всегда с интересом рассматриваю оригинальное творчество alpap, ИМХО необходимо перед копированием очищать Out.

Немного другой вариант: я не нумерую все файлы, я нумерую файлы только с совпадающими именами, а не сплошняком. Нумерация файлов с одинаковыми именами и разными расширениями из одной папки одинаковая. Учитываю маски.

Код:

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

@Echo Off
cls
	Set Folders="Z:\Program Files\Internet Explorer" "Z:\Program Files\7-Zip\Lang" "Z:\Video\Разное\Животные" "Z:\Box_In\Program Files\Internet Explorer" "Z:\Box_In\Program Files\7-Zip\Lang" "Z:\Box_In\Video\Разное\Животные"
	Set Mask="*.bat" "2*.xlsx"
	Set "Out=Z:\Out"
	2>nul Pushd "%Out%" &&(2>nul Rd "%Out%" /S /Q &Popd)||(>nul 2>&1 Md "%Out%")
	For %%d In (%Folders%) Do Call :MyCopy "%%~d" "%%~nxd" "%Mask%" "%Out%"
	For /F "usebackq delims=" %%d In (`2^>nul Dir %Folders% /B /S /A:D`) Do Call :MyCopy "%%d" "%%~nxd" "%Mask%" "%Out%"
pause		
Exit /B
:MyCopy
	Pushd %1
	Set "Add="
	If Not Exist "%~4\%~2.*" GoTo :ContMyCopy                                             	
	Set /A i=100
	:Begin
		Set /A i+=1
		Set "Add=_%i:~-2%"
		If Exist "%~4\%~2%Add%.*" GoTo :Begin                                             	
	:ContMyCopy
 	Call :MyReCopy %4 %2 "%Add%" %~3
	Popd
Exit /B 
:MyReCopy
	If "%~4"=="" Exit /B
	For /F "usebackq delims=" %%f In (`2^>nul Dir %4 /B /A:-D /O:-D /T:W`) Do (>nul Copy "%%f" "%~1\%~2%~3%%~xf" &GoTo :ContMyReCopy)
	:ContMyReCopy
	Shift /4
	GoTo :MyReCopy
Exit /B
Аватара пользователя
NuclearBox

Re: CMD/BAT - [решено] Скопировать из множества папок по одному самому новому файлу с переименованием.

Сообщение NuclearBox »

Цитата NuclearBox:



зная код, можно быстро определить какой файл с повторяющимся именем из какой папки пришел, или не пришел
CMD/BAT - [решено] Скопировать из множества папок по одному самому новому файлу с переименованием.







Не надо знать код, надо задокументировать копирование в .Log-файле.

[spoiler]

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

@Echo Off
cls
	Set Folders="Z:\Program Files\Internet Explorer" "Z:\Program Files\7-Zip\Lang" "Z:\Video\Разное\Животные" "Z:\Box_In\Program Files\Internet Explorer" "Z:\Box_In\Program Files\7-Zip\Lang" "Z:\Box_In\Video\Разное\Животные"
	Set Mask="*.bat" "2*.xlsx"
	Set "Out=Z:\Out"
	Set "Log=Z:\Out\__%~nx0.log"
	2>nul Pushd "%Out%" &&(2>nul Rd "%Out%" /S /Q &Popd)||(>nul 2>&1 Md "%Out%")
	For %%d In (%Folders%) Do Call :MyCopy "%%~d" "%%~nxd" "%Mask%" "%Out%"
rem	For /F "usebackq delims=" %%d In (`2^>nul Dir %Folders% /B /S /A:D`) Do Call :MyCopy "%%d" "%%~nxd" "%Mask%" "%Out%"
pause		
Exit /B
:MyCopy
	Pushd %1
	Set "Add="
	If Not Exist "%~4\%~2.*" GoTo :ContMyCopy                                             	
	Set /A i=100
	:Begin
		Set /A i+=1
		Set "Add=_%i:~-2%"
		If Exist "%~4\%~2%Add%.*" GoTo :Begin                                             	
	:ContMyCopy
 	Call :MyReCopy %1 %4 %2 "%Add%" %~3
	Popd
Exit /B 
:MyReCopy
	If "%~5"=="" Exit /B
	For /F "usebackq delims=" %%f In (`2^>nul Dir %5 /B /A:-D /O:-D /T:W`) Do (
		>nul Copy "%%f" "%~2\%~3%~4%%~xf"
		>>"%Log%" Echo "%~2\%~3%~4%%~xf"	^<---- "%~1\%%f"
		GoTo :ContMyReCopy
	)
	:ContMyReCopy
	Shift /5
	GoTo :MyReCopy
Exit /B
[/spoiler]
Аватара пользователя
NuclearBox

Re: CMD/BAT - [решено] Скопировать из множества папок по одному самому новому файлу с переименованием.

Сообщение NuclearBox »

А теперь задача со звёздочкой: если там а) и впрямь копирование, б) в пределах одного раздела, в) в скопированные файлы не вносится изменений — вместо копирования создаём жёсткие ссылки Изображение.
Ответить

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