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

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

Ответить
Настройки темы
CMD/BAT - Раскладка файлов по части имени

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


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

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


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

Отправлено: 11:56, 04-09-2020

 

Ветеран


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

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


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

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

Цитата Dyaus:
так же после папки идет текущий месяц и год, после текущая дата. Пример 04/Septembe.20/03. »
Вот нахрена Зачем так? Почему не нормально, вменяемо и удобно — «…\2020.09\…»?!

Отправлено: 12:56, 04-09-2020 | #2



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

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


Аватара для Elven

Ветеран


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

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


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

Отправлено: 12:57, 04-09-2020 | #3


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


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

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


Действительно дефисы. После дефиса нужны только две цифры. К сожалению в таком формате 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 сегодняшнее число. Было бы лучше одинаковые файлы переименовать.

Отправлено: 13:51, 04-09-2020 | #4


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


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

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


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

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

Отправлено: 14:11, 04-09-2020 | #5


Аватара для Elven

Ветеран


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

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


Код: Выделить весь код
@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
Только месяцы я переименовывать не буду, тем более что и названия у них судя по сентябрю весьма оригинальные. Где-то на форуме это уже обсуждалось и решение приводилось (емнип - даже не одно).

Отправлено: 15:01, 04-09-2020 | #6


Ветеран


Contributor


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

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


Код: Выделить весь код
@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

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


Последний раз редактировалось megaloman, 05-09-2020 в 10:03.

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

Отправлено: 15:05, 04-09-2020 | #7


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


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

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


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

Отправлено: 15:06, 04-09-2020 | #8


Ветеран


Contributor


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

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


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

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


Последний раз редактировалось megaloman, 05-09-2020 в 10:03.


Отправлено: 15:56, 04-09-2020 | #9


Ветеран


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

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


Цитата Dyaus:
К сожалению в таком формате 04/Septembe.20/03 на работе существует давно так. »
Лучше посидеть и один раз переделать под структуру вида ГГГГ.ММ — так у Вас хоть сортировка в Проводнике будет нормальная.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:28, 04-09-2020 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - скрипт сравнение файлов и копирования по части имени mallonih Скриптовые языки администрирования Windows 7 23-01-2020 09:21
CMD/BAT - [решено] Копирование файлов в папки в зависимости от части имени nana_MeDBeD Скриптовые языки администрирования Windows 2 16-08-2017 04:37
CMD/BAT - [решено] извлечение имени файлов, а также части имени с дописанием Alexander_88 Скриптовые языки администрирования Windows 7 09-05-2015 01:45
CMD/BAT - перемещение файлов в каталог созданный из части имени файла surrender1 Скриптовые языки администрирования Windows 9 10-10-2013 14:42
CMD/BAT - [решено] Сравнение файлов по части имени sampir Скриптовые языки администрирования Windows 2 18-11-2012 19:57




 
Переход