Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] Переместить файлы в папки с их именем.

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


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

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


Здравствуйте,

Прошу помочь с Батником ил скриптом для следующей задачи.
От предыдущего преподавателя курсов ИЗО мне достался компьютер, где большое количество изображений работ учеников. Свалено все это в несколько папок. Задача избежать ручного монотонного перемещения графических файлов (JPG) по папкам с фамилией и инициалами ученика.
Большая часть файлов имеет следующее имя: Фамилия(пробел)инициалы.через.точку(пробел)дата в формате 01.01.18. То есть (Иванов А.Б. 02.02.2018.JPG), (Иванов А.Б. 05.03.2018.JPG), (Иванов В.Г. 31.12.2017.JPG), (Иванов В.Г. 06.05.2018.JPG) и тд.
Задача стоит в том что бы разложить все графические файлы допустим ученика Иванова А.Б. в папку "ИвановАБ", то есть все файлы у которых в названии есть "Иванов А.Б." (Иванов А.Б. 02.02.2018.JPG, Иванов А.Б. 05.03.2018.JPG) попадают в создаваемую сценарием папку "ИвановАБ". И соответственно файлы у которых в имени есть Иванов В.Г. (Иванов В.Г. 31.12.2017.JPG, Иванов В.Г. 06.05.2018.JPG) попадают попадают в создаваемую сценарием папку "ИвановВГ" и тд, со всеми учениками.

Спасибо.

Отправлено: 16:18, 11-10-2018

 

Ветеран


Contributor


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

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


Цитата peequ84:
Большая часть файлов имеет следующее имя: Фамилия(пробел)инициалы.через.точку(пробел)дата в формате 01.01.18.
То есть (Иванов А.Б. 02.02.2018.JPG), »
Вот вариант для имен "Фамилия И.О. дд.мм.гггг.расширение". Здесь сделан контроль на то, что в нужной позиции содержится номер года. Возможно, это излишне жестко
Код: Выделить весь код
@Echo Off                                                                                                 
cls
	Call :Folders "Z:\Box_In" "* ?.?. ??.??.????.jpg" "Z:\Box_Out" 
	Call :Folders "Z:\Soft_In" "* ?.?. ??.??.????.jpg" "Z:\Box_Out" 
pause
GoTo :Eof

:Folders
	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /O:-D /S "%~1\%~2"`) DO Call :MoveName "%%f" %1 %3
Exit /B

:MoveName
	FOR /F "tokens=1,2,3,6 delims=. " %%i IN ("%~nx1") DO (
		If 12000 LEQ 1%%l If 1%%l LEQ 12099 (
			If Not Exist "%~3\%%i%%j%%k" MD "%~3\%%i%%j%%k"
			   Echo Move %1 "%~3\%%i%%j%%k\"
				Move %1 "%~3\%%i%%j%%k\" >nul
		)
	)
Exit /B
Если ориентироваться только на "Фамилия И.О.*.расширение"
Код: Выделить весь код
@Echo Off                                                                                                 
cls
	Call :Folders "Z:\Box_In" "* ?.?.*.jpg" "Z:\Box_Out" 
	Call :Folders "Z:\Soft_In" "* ?.?.*.jpg" "Z:\Box_Out" 
pause
GoTo :Eof

:Folders
	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /O:-D /S "%~1\%~2"`) DO Call :MoveName "%%f" %1 %3
Exit /B

:MoveName
	FOR /F "tokens=1,2,3 delims=. " %%i IN ("%~nx1") DO (
		If Not Exist "%~3\%%i%%j%%k" MD "%~3\%%i%%j%%k"
		Echo Move %1 "%~3\%%i%%j%%k\"
		     Move %1 "%~3\%%i%%j%%k\" >nul
	)
Exit /B
Цитата peequ84:
Свалено все это в несколько папок. »
Пропишите в батнике нужное количество строк Call :Folders .... с нужными путями папок (без \ на конце) и расширением

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


Последний раз редактировалось megaloman, 12-10-2018 в 09:39.

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

Отправлено: 21:40, 11-10-2018 | #2



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

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


Ветеран


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

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


На WSH:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile

Dim strDestFolder


If WScript.Arguments.Count = 1 Then
	strSourceFolder = WScript.Arguments.Item(0)
	
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	If objFSO.FolderExists(strSourceFolder) Then
		With WScript.CreateObject("VBScript.RegExp")
			.Pattern    = "^(\S+) (\S)\.(\S)\. \d{2}\.\d{2}\.\d{4}\.(?:jpg|jpeg)$"
			.IgnoreCase = True
			
			For Each objFile In objFSO.GetFolder(strSourceFolder).Files
				If .Test(objFile.Name) Then
					With .Execute(objFile.Name).Item(0).Submatches
						strDestFolder = objFSO.BuildPath(strSourceFolder, .Item(0) & .Item(1) & .Item(2))
						
						If Not objFSO.FolderExists(strDestFolder) Then
							objFSO.CreateFolder strDestFolder
						End If
						
						objFile.Move strDestFolder & "\"
					End With
				End If
			Next
		End With
	Else
		WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
	WScript.Quit 1
End If

WScript.Quit 0

Путь к целевому каталогу задаётся параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике).

Последний раз редактировалось Iska, 12-10-2018 в 21:27. Причина: Поправлена неточность в шаблоне

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

Отправлено: 21:58, 11-10-2018 | #3


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


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

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


Цитата megaloman:
Если ориентироваться только на "Фамилия И.О.*.расширение" »
Огромное спасибо! А если все же формат выходной папки сделать с точками и пробелом то есть "Иванов А.Б."

то что надо изменить в этом сценарии?

Отправлено: 10:05, 12-10-2018 | #4


Ветеран


Contributor


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

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


Цитата peequ84:
формат выходной папки сделать с точками и пробелом то есть "Иванов А.Б." »
Одобряю, это более читаемо. Измените процедуру.
Код: Выделить весь код
:MoveName
	FOR /F "tokens=1,2,3 delims=. " %%i IN ("%~nx1") DO (
		If Not Exist "%~3\%%i %%j.%%k." MD "%~3\%%i %%j.%%k."
		Echo Move %1 "%~3\%%i %%j.%%k.\"
		     Move %1 "%~3\%%i %%j.%%k.\" >nul
	)
Exit /B
Кстати, выделенная строка с Echo может быть удалена. Я её вставил, чтобы наблюдать процесс.

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


Отправлено: 10:39, 12-10-2018 | #5


Ветеран


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

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


megaloman, у Вас тоже каталоги создаются либо без последней точки, либо с двумя ?
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:34, 12-10-2018 | #6


Ветеран


Contributor


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

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


Iska, Вы натыкали носом в мою невнимательность: конечно же, без точки на конце. Где-то уже об это спотыкался

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


Отправлено: 10:07, 13-10-2018 | #7


Ветеран


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

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


можно взять имя (все имя папки имеется ввиду) в скобочки, если эстетика ТС устроит, а иначе с точкой в конце только в скрытых и открываться не будет, а также и удаляться обычными средствами, т.е. толку 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:56, 13-10-2018 | #8


Ветеран


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

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


Цитата alpap:
…и открываться не будет, а также и удаляться обычными средствами, т.е. толку 0 »
Что значит практически не пользоваться Проводником… Таки да — Вы правы: не открывается:
Скрытый текст
и не удаляется из-под него.

P.S. Под Far Manager'ом поведение нормальное, так что даже никогда не обращал внимания, что Проводник такое не «переваривает».

Отправлено: 20:20, 13-10-2018 | #9



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Переместить все файлы JPG и TXT, заканчивающиеся на цифры 0,1,2...9 в номерные папки use809 Скриптовые языки администрирования Windows 2 21-11-2015 04:03
Разное - [решено] Не запускаются файлы с именем setup.exe (именно с именем) Temix Microsoft Windows 8 и 8.1 13 12-12-2014 22:05
CMD/BAT - [решено] Переместить все файлы и папки pzh2393 Скриптовые языки администрирования Windows 7 11-04-2013 11:52
VBS/WSH/JS - [решено] Надо скопировать файлы из одной папки в другую, но только если их нет в третьей rromms Скриптовые языки администрирования Windows 3 11-09-2011 21:42
CMD/BAT - [решено] Найти папкИ и переместить их по указанному пути... djvall Скриптовые языки администрирования Windows 1 02-02-2011 08:58




 
Переход