CMD/BAT - Перемещение файлов в папки с аналогичными именами

Ответить
 • Просмотры: 1
Аватара пользователя
londondron

CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение londondron »

Добрый день.

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

Не могу разобраться с форматом записи и как правильно присваивать значения переменным.



Код:

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

cls
chcp 1251
@echo off
set "tr=C:\Users\VML\OneDrive\Приказы" - это я упрощаю использование пути
for %%a in ("%tr%"\*.jpg) do (                 - перебор файлов jpeg
	set "fn=%%a"                                   - присваиваю новой переменной значение переменной из for, чтобы из нее м.б. извлечь фамилию
	set "sn=%%fn:%tr%=%%"              - первым делом пытаюсь удалить путь к файлу, чтобы осталось только его имя, НО ЗДЕСЬ в итоге ничего и не получается
	echo %sn%
)
set tr=                                                       - удаляю использованные переменные
set sn=
set fn=

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

Прошу строго не судить.
Аватара пользователя
Iska

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение Iska »

Цитата londondron:



используя часть имени файла (а именно фамилию человека)
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Какую часть? Как выглядят имена файлов, как в них определить, что вот эта часть — фамилия?




Цитата londondron:



находить уже существующую папку
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Где находить?
Аватара пользователя
Iska

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение Iska »

файлы имеют такой формат: "Фамилия_Прием.jpg"

Папки с фамилиями расположены в папке: "C:\Users\VML\OneDrive\ЛИЧНЫЕ ДЕЛА\" и имеют формат "00-00-00 Фамилия".
Аватара пользователя
londondron

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение londondron »

файлы имеют такой формат: "Фамилия_Прием.jpg"

Папки с фамилиями расположены в папке: "C:\Users\VML\OneDrive\ЛИЧНЫЕ ДЕЛА\" и имеют формат "00-00-00 Фамилия".
Аватара пользователя
londondron

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение londondron »

londondron,

1. как понять слово Прием в имени файла? Оно неизменно присутствует в каждом имени или это некое слово, которое индивидуально для каждого файла?

2. В имени файла только один символ подчёркивания?

3. А в папке, куда перемещаем файл, не может быть такого же более раннего?

4. А однофамильцы учитываются?

5. А если папки нет, её создавать? А что такое 00-00-00?
Аватара пользователя
megaloman

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение megaloman »

londondron,Вот код по Вашему заданию.

1. Файлы называются *_Прием.jpg Фамилия отделяется символом _ подчёркивания. В фамилии не может быть _

2. Если в выходной папке уже присутствует файл с совпадающим именем, файл не перемещается

3. Если папки нет, файл не перемещается.

Как описАли, так и сделано Изображение

Код:

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

@Echo Off
chcp 1251 >nul
Set "BoxIn=Z:\Users\VML\OneDrive\Приказы"
Set "MaskIn=*_Прием.jpg"
Set "BoxOut=Z:\Users\VML\OneDrive\ЛИЧНЫЕ ДЕЛА" 
Set "MaskOut=??-??-?? "
FOR /F "usebackq delims=" %%f IN (`Dir "%BoxIn%\%MaskIn%" /B /A:-D 2^>nul`) DO (
	FOR /F "tokens=1 delims=_" %%i IN ("%%f") DO (
		FOR /F "usebackq delims=" %%d IN (`Dir "%BoxOut%\%MaskOut%%%i" /B /A:D 2^>nul`) DO (
			Move "%BoxIn%\%%f" "%BoxOut%\%%d\" >nul
		)
	)
)
Аватара пользователя
londondron

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение londondron »

Спасибо!

Все именно так, как Вы написали в последнем посте.

Сейчас буду пробовать и разбираться. Потом отпишусь.
Аватара пользователя
londondron

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение londondron »

Цитата londondron:



и я более менее разобрался в команде FOR, наконец-то понятно, для чего usebackq нужен.
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Так для чего?




Цитата londondron:



каковы возможности работы с переменными цикла. Вообще можно ли их значения присвоить обычным переменным,
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Можно.




Цитата londondron:



затем проводить с этими обычными переменными манипуляции (обрезать, заменять и т.п.)
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Можно. Главное, не забывать, что раскрытие переменных окружения по %…% происходит в момент входа в операторные скобки. Потому требуется либо двойное раскрытие по call … %%SomeVar%%, либо enabledelayedexpansion и !SomeVar!.




Цитата londondron:



Тогда возможно было бы выполнить эти манипуляции в рамках одного цикла?
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Где Вы, полагаете, лишние циклы в коде?
Аватара пользователя
Iska

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение Iska »

Цитата Iska:



Так для чего?
CMD/BAT - Перемещение файлов в папки с аналогичными именами




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


Цитата Iska:



Можно. Главное, не забывать, что раскрытие переменных окружения по %…% происходит в момент входа в операторные скобки. Потому требуется либо двойное раскрытие по call … %%SomeVar%%, либо enabledelayedexpansion и !SomeVar!.
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Это для меня немного труднее. С наскока не разберусь.


Цитата Iska:



Где Вы, полагаете, лишние циклы в коде?
CMD/BAT - Перемещение файлов в папки с аналогичными именами




Извиняюсь, не сразу разобрал последний FOR, поэтому не сразу понял, зачем 2-й DIR.

Получается, что в MOVE задать путь для перемещения файлов маской невозможно, для этого вызывается DIR 2-й раз.

Но... 1-й и 2-й FOR я все-таки объединил, т.к. из 1-й команды DIR сразу можно взять фамилии, стоящие до знака "_", а затем подставить их перед маской перемещаемых файлов в MOVE.

Без 2-го DIR, при том обстоятельстве, что невозможно использовать маску В ПУТИ НАЗНАЧЕНИЯ КОМАНДЫ MOVE, конечно не обойтись.

Вот мой код (здесь переменные цикла немного другие, а %BoxOut2% - заданный путь внутри папки - в вопросе я его, упрощая, не писал, т.к. хотел понять главное)



Код:

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

for /f "usebackq tokens=1 delims=_" %%a in (`dir "%BoxIn%\%MaskIn%" /b /a:-d`) do (
	for /f "usebackq delims=" %%b in (`dir "%BoxOut%\%MaskOut%%%a" /b /a:d`) do move "%BoxIn%\%%a%MaskIn%" "%BoxOut%\%%b\%BoxOut2%\"
	)
Аватара пользователя
londondron

Re: CMD/BAT - Перемещение файлов в папки с аналогичными именами

Сообщение londondron »

londondron, значения переменных цикл можно присвоить обычным переменным, затем проводить с этими обычными переменными манипуляции (обрезать, заменять и т.п.) , например

Код:

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

@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
FOR %%d IN (01.34.6789 31.02.1812 22.03.2017) DO (
	Set "TData=%%d"
	Set "DD=!TData:~0,2!
	Set "MM=!TData:~3,2!
	Set "YYYY=!TData:~6,4!
	Echo %%d  !DD!  !MM!  !YYYY!  
)
pause
Ответить

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