PDA

Показать полную графическую версию : [решено] Переместить файлы в папки с их именем.


peequ84
11-10-2018, 16:18
Здравствуйте,

Прошу помочь с Батником ил скриптом для следующей задачи.
От предыдущего преподавателя курсов ИЗО мне достался компьютер, где большое количество изображений работ учеников. Свалено все это в несколько папок. Задача избежать ручного монотонного перемещения графических файлов (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) попадают попадают в создаваемую сценарием папку "ИвановВГ" и тд, со всеми учениками.

Спасибо.

megaloman
11-10-2018, 21:40
Большая часть файлов имеет следующее имя: Фамилия(пробел)инициалы.через.точку(пробел)дата в формате 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Свалено все это в несколько папок. »
Пропишите в батнике нужное количество строк Call :Folders .... с нужными путями папок (без \ на конце) и расширением

Iska
11-10-2018, 21:58
На 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

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

peequ84
12-10-2018, 10:05
Если ориентироваться только на "Фамилия И.О.*.расширение" »

Огромное спасибо! А если все же формат выходной папки сделать с точками и пробелом то есть "Иванов А.Б."

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

megaloman
12-10-2018, 10:39
формат выходной папки сделать с точками и пробелом то есть "Иванов А.Б." »Одобряю, это более читаемо. Измените процедуру.: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 может быть удалена. Я её вставил, чтобы наблюдать процесс.

Iska
12-10-2018, 21:34
megaloman, у Вас тоже каталоги создаются либо без последней точки, либо с двумя ;)?

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

alpap
13-10-2018, 11:56
можно взять имя (все имя папки имеется ввиду) в скобочки, если эстетика ТС устроит, а иначе с точкой в конце только в скрытых и открываться не будет, а также и удаляться обычными средствами, т.е. толку 0

Iska
13-10-2018, 20:20
…и открываться не будет, а также и удаляться обычными средствами, т.е. толку 0 »
Что значит практически не пользоваться Проводником… Таки да — Вы правы: не открывается:https://i.imgur.com/1VFIqpw.pngи не удаляется из-под него.

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




© OSzone.net 2001-2012