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

Dyaus 04-09-2020 11:56 2932904

Раскладка файлов по части имени
 
В папку периодично ложатся файлы разных расширений по названиям к примеру 18-04261, 05-03182. Необходимо их раскладывать по папкам названия которых равны первым цифрам после тире, по примерах 04 и 03 соответственно, так же после папки идет текущий месяц и год, после текущая дата. Пример 04/Septembe.20/03. Если папки не существуют, их создать. Заранее спасибо за помощь.

Iska 04-09-2020 12:56 2932910

Dyaus, примеры реальных имён файлов приведите. С расширениями.

Цитата:

Цитата Dyaus
первым цифрам после тире »

Сколько именно нужно брать цифр? И здесь Вы пишете — «тире», а выше пишете дефисы.

Цитата:

Цитата Dyaus
так же после папки идет текущий месяц и год, после текущая дата. Пример 04/Septembe.20/03. »

Вот нахрена Зачем так? Почему не нормально, вменяемо и удобно — «…\2020.09\…»?!

Elven 04-09-2020 12:57 2932911

папку/файл с "/" в названии не то чтобы невозможно создать, но я за такое не возьмусь. потому с форматом что-то нужно менять. или месяц-год-дата это вложенные папки?
Что по поводу совпадений имен файлов в одной и той же папке? заменять, спрашивать, игнорировать, переименовывать?
сколько цифр после тире брать (вроде как вижу что две, но мало ли...) если количество плавающее - как определять?
Где находятся папки по которым нужно раскладывать (или где их нужно создвавать)?
пока набросал что-то вот такое (с созданием папок в директории в которой ведется обработка, без добавления даты и без обработки совпадающих имен файлов):
Код:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
pushd d:/tmp/
for /f "delims=" %%i in ('dir /b /a:-d *.txt') do (
        for /f "tokens=2 delims=-" %%j in ("%%i") do (
                set fname=%%j
                if not exist "!fname:~0,2!" (
                        md "!fname:~0,2!"
                )
                echo move "%%i" "!fname:~0,2!/%%i"
        )
)
popd

и да, без реального перемещения (echo перед move если убрать - будет с перемещением, но не советую пока не выяснены остальные вопросы)

Dyaus 04-09-2020 13:51 2932920

Действительно дефисы. После дефиса нужны только две цифры. К сожалению в таком формате 04/Septembe.20/03 на работе существует давно так. Чаще всего файлы 01-05041, 03-08041, 25-02041 и т.д. расширения подавляюще xls, xlsx, doc, docx. Реже pdf, jpg, jpeg. В формате к примеру 01-05041.xlsx нужно переместить в папку 05/Septembe.20/04 , где 04 сегодняшнее число. Было бы лучше одинаковые файлы переименовать.

Dyaus 04-09-2020 14:11 2932925

В смысле папка 05 в ней папка Septembe.20, в ней уже 04

В смысле папка 05 в ней папка Septembe.20, в ней уже папка 04

Elven 04-09-2020 15:01 2932931

Код:

@echo off

for /f "tokens=1* delims==" %%a in ('"wmic path win32_localtime get Day,Month,Year /value|find "^=""') do set "%%a=0%%b"
set Year=%Year:~-5%
set Month=%Month:~-3%
set Day=%Day:~-3%


SETLOCAL ENABLEDELAYEDEXPANSION

pushd d:\tmp
for /f "delims=" %%i in ('dir /b /a:-d *.txt') do (
        for /f "tokens=2 delims=-" %%j in ("%%i") do (
                set fname=%%j
                if not exist "!fname:~0,2!" (
                        md "!fname:~0,2!"
                )
                if not exist "!fname:~0,2!/%Month%.%Year%" (
                        md "!fname:~0,2!/%Month%.%Year%"
                )
                if not exist "!fname:~0,2!/%Month%.%Year%/%Day%" (
                        md "!fname:~0,2!/%Month%.%Year%/%Day%"
                )
                if not exist "!fname:~0,2!/%%i" (
                        echo move "%%i" "!fname:~0,2!/%Month%.%Year%/%Day%/%%i"
                ) else (
                        echo move "%%i" "!fname:~0,2!/%Month%.%Year%/%Day%/%%~ni_%random%.%%~xi"
                )
        )
)
popd

Только месяцы я переименовывать не буду, тем более что и названия у них судя по сентябрю весьма оригинальные. Где-то на форуме это уже обсуждалось и решение приводилось (емнип - даже не одно).

megaloman 04-09-2020 15:05 2932934

Код:

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

        Call :FolderToday "DName"
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\??-?????.*" /O:N /B /A:-D`) DO (
                Set "FName=%%~nxf"
                >nul Call XCopy /Y "%BoxIn%\%%~nxf"  "%BoxOut%\%%FName:~3,2%%\%DName%\"&&Del "%BoxIn%\%%~nxf"
        )
Pause
Exit /B

:FolderToday
SetLocal
        Set "M01=January"
        Set "M02=February"
        Set "M03=March"
        Set "M04=April"
        Set "M05=May"
        Set "M06=June"
        Set "M07=July"
        Set "M08=August"
        Set "M09=September"
        Set "M10=October"
        Set "M11=November"
        Set "M12=December"

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LocalDateTime /VALUE') DO SET "TDate=%%d"
        Call Set "TDate=%%M%TDate:~4,2%%%.%TDate:~2,2%\%TDate:~6,2%"
EndLocal &Call Set "%~1=%TDate%"
Exit /B


Dyaus 04-09-2020 15:06 2932936

Большое спасибо, буду пробовать

megaloman 04-09-2020 15:56 2932941

Dyaus, В предыдущем посте при совпадении имён файлы будут переписываться. ИМХО, подозреваю, реально в одном дне совпадений быть не может. Однако, если такое возможно, то
При совпадении имён в одном дне файлы будут переименованы:
имя(1).расширение имя(2).расширение и т д
Код:

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

        Call :FolderToday "DName"
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\??-?????.*" /O:N /B /A:-D`) DO (
                Set "FName=%%~nxf"
                Call :MyMove "%BoxIn%\%%~nxf" "%BoxOut%\%%FName:~3,2%%\%DName%"
        )
Pause
Exit /B

:MyMove
        Set /A i=0
        Set "FFn=%~n1"
        Set "FFx=%~x1"
        :Begin
                If Not Exist "%~2\%FFn%%FFx%" GoTo :Out
                Set /A i+=1
                Set "FFn=%~n1(%i%)"
        GoTo :Begin
        :Out
                If Not "%FFn%%FFx%"=="%~nx1" Ren "%~1" "%FFn%%FFx%"
                >nul Call XCopy /Y "%BoxIn%\%FFn%%FFx%"  "%BoxOut%\%%FName:~3,2%%\%DName%\"&&Del "%BoxIn%\%FFn%%FFx%"
Exit /B

:FolderToday
SetLocal
        Set "M01=January"
        Set "M02=February"
        Set "M03=March"
        Set "M04=April"
        Set "M05=May"
        Set "M06=June"
        Set "M07=July"
        Set "M08=August"
        Set "M09=September"
        Set "M10=October"
        Set "M11=November"
        Set "M12=December"

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LocalDateTime /VALUE') DO SET "TDate=%%d"
        Call Set "TDate=%%M%TDate:~4,2%%%.%TDate:~2,2%\%TDate:~6,2%"
EndLocal &Call Set "%~1=%TDate%"
Exit /B


Iska 04-09-2020 16:28 2932943

Цитата:

Цитата Dyaus
К сожалению в таком формате 04/Septembe.20/03 на работе существует давно так. »

Лучше посидеть и один раз переделать под структуру вида ГГГГ.ММ — так у Вас хоть сортировка в Проводнике будет нормальная.


Время: 04:32.

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