Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переместить файлы в папки с их именем. (http://forum.oszone.net/showthread.php?t=337127)

peequ84 11-10-2018 16:18 2835438

Переместить файлы в папки с их именем.
 
Здравствуйте,

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

Цитата:

Цитата 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 .... с нужными путями папок (без \ на конце) и расширением

Iska 11-10-2018 21:58 2835499

На 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 2835555

Цитата:

Цитата megaloman
Если ориентироваться только на "Фамилия И.О.*.расширение" »

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

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

megaloman 12-10-2018 10:39 2835563

Цитата:

Цитата 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 может быть удалена. Я её вставил, чтобы наблюдать процесс.

Iska 12-10-2018 21:34 2835644

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

megaloman 13-10-2018 10:07 2835675

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

alpap 13-10-2018 11:56 2835699

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

Iska 13-10-2018 20:20 2835756

Цитата:

Цитата alpap
…и открываться не будет, а также и удаляться обычными средствами, т.е. толку 0 »

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

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


Время: 19:46.

Время: 19:46.
© OSzone.net 2001-