Компьютерный форум 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=338293)

Numufar 18-12-2018 10:38 2846721

Перемещение файлов в папку, названную частью имени этого файла
 
Здравствуйте, господа.
Есть много файлов с форматом имени:
DD-MM-YYYY_hh-mm-ss_in_out.mp3
Например:
17-12-2018_16-20-48_2000_3000.mp3
18-12-2018_10-26-31_1000_88005553535.mp3
Отличаться по количеству символов может только последний номер("out").
Нужно создать папку с именем, совпадающим с "in" и переместить в неё все файлы, у которых "in" совпадает с именем папки.
То есть, взять "17-12-2018_16-20-48_2000_3000.mp3", создать папку "2000" и переместить в него этот файл. Взять "18-12-2018_10-26-31_1000_88005553535.mp3", создать папку "1000" и переместить этот файл в созданную или уже существующую папку.
Нужно пропускать первые 20 символов и, начиная с 21-го, брать 4 символа и создавать папку с таким именем, а затем перемещать файл.
Каким образом это можно реализовать? Может лучше создание папки и перемещение файла разбить на два скрипта?
Спасибо.

Elven 18-12-2018 11:41 2846737

Код:

@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
for /f %%i in ('dir /b /a-d *.mp3') do (
set name=%%i
set namec=!name:~20,4!
if not exist !namec! md !namec!
move "!name!" "!namec!\!name!"
)

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

Iska 18-12-2018 11:49 2846744

Здесь и здесь:
Цитата:

17-12-2018_16-20-48_2000_3000.mp3
18-12-2018_10-26-31_1000_88005553535.mp3
могут быть только цифры?

Попробуйте так (на WSH):
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile

Dim strDestFolder


If WScript.Arguments.Count = 1 Then
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        strSourceFolder = objFSO.GetAbsolutePathName(WScript.Arguments.Item(0))
       
        If objFSO.FolderExists(strSourceFolder) Then
                With WScript.CreateObject("VBScript.RegExp")
                        .Pattern = "^\d{2}-\d{2}-\d{4}_\d{2}-\d{2}-\d{2}_(\d+)_\d+\.mp3$"
                        .IgnoreCase = True
                       
                        For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                                If .Test(objFile.Name) Then
                                        strDestFolder = objFSO.BuildPath(strSourceFolder, .Execute(objFile.Name).Item(0).Submatches.Item(0))
                                       
                                        If Not objFSO.FolderExists(strDestFolder) Then
                                                objFSO.CreateFolder strDestFolder
                                        End If
                                       
                                        objFile.Move strDestFolder & "\"
                                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


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

Numufar 18-12-2018 11:53 2846746

Спасибо!
Вроде бы всё работает. С названиями проблем возникнуть не должно.
Я пытался сделать что-то вроде этого:

Код:

@ECHO ON
SETLOCAL
SET "sourcedir=D:\tst"
PUSHD %sourcedir%
FOR /f "tokens=3 delims=_" %%a IN (
 'dir /b /a-d "*_*_*_*.*"'
 ) DO ( 
MD %%a 2>nul
MOVE "%%a_%%b_%%c_%%d" .\%%a\ >nul
)
POPD
GOTO :EOF

Папки создаются, а вот файлы не перемещаются((

И да, будут только цифры, в предпоследней части исключительно 4х-значные цифры.

megaloman 18-12-2018 12:26 2846758

Numufar, До кучи еще вариант
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "BoxOut=Z:\Box_Out"

        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /A:-D "%BoxIn%\??-??-20??_??-??-??_*_*.mp3"`) DO (
                FOR /F "tokens=7 delims=-_" %%i IN ("%%f") DO (
                        If Not Exist "%BoxOut%\%%i" Md "%BoxOut%\%%i"
                        Move "%BoxIn%\%%f" "%BoxOut%\%%i\" >nul
                )
        )

BoxIn и BoxOut могут совпадать
Если батник, файлы, создаваемые папки находятся в одной общей папке
Код:

@Echo Off
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /A:-D "%~dp0??-??-20??_??-??-??_*_*.mp3"`) DO (
                FOR /F "tokens=7 delims=-_" %%i IN ("%%f") DO (
                        If Not Exist "%~dp0%%i" Md "%~dp0%%i"
                        Move "%~dp0%%f" "%~dp0%%i\" >nul
                )
        )

Если BoxIn и BoxOut совпадают, также можно просто перетащить папку на скрипт в Проводнике
Код:

@Echo Off
        If "%1"=="" Exit /B 1

        Set "BoxIn=%~1"
        Set "BoxOut=%~1"

        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /A:-D "%BoxIn%\??-??-20??_??-??-??_*_*.mp3"`) DO (
                FOR /F "tokens=7 delims=-_" %%i IN ("%%f") DO (
                        If Not Exist "%BoxOut%\%%i" Md "%BoxOut%\%%i"
                        Move "%BoxIn%\%%f" "%BoxOut%\%%i\" >nul
                )
        )


Numufar 18-12-2018 12:46 2846767

Способ megaloman понравился больше всего, спасибо всем!) Один из немногих форумов, где реально помогают, а не пытаются самоутвердиться за счёт чужого незнания.


Время: 16:04.

Время: 16:04.
© OSzone.net 2001-