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

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

Ответить
Настройки темы
CMD/BAT - [решено] Перемещение файлов в папку, названную частью имени этого файла

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


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

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


Здравствуйте, господа.
Есть много файлов с форматом имени:
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 символа и создавать папку с таким именем, а затем перемещать файл.
Каким образом это можно реализовать? Может лучше создание папки и перемещение файла разбить на два скрипта?
Спасибо.

Отправлено: 10:38, 18-12-2018

 

Аватара для Elven

Ветеран


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

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


Код: Выделить весь код
@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!"
)
как обычно открыт вопрос что делать если будут иметь место файлы с одинаковым названием, но учитывая, что вроде как они вообще все в одной папке свалены, проблем возникнуть не должно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:41, 18-12-2018 | #2



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

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


Ветеран


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

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


Здесь и здесь:
Цитата:
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

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

Отправлено: 11:49, 18-12-2018 | #3


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


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

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


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

Код: Выделить весь код
@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х-значные цифры.

Отправлено: 11:53, 18-12-2018 | #4


Ветеран


Contributor


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

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


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
		)
	)

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


Последний раз редактировалось megaloman, 18-12-2018 в 16:51.

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

Отправлено: 12:26, 18-12-2018 | #5


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


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

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


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

Отправлено: 12:46, 18-12-2018 | #6



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Создание папки по имени файла и перемещение файла в эту папку. lovator Скриптовые языки администрирования Windows 20 30-03-2024 13:55
Любой язык - [решено] Скрипт который раскидывает файлы по папкам, с частью имени этих файлов username-qq Скриптовые языки администрирования Windows 6 06-10-2018 18:30
CMD/BAT - перемещение файлов в каталог созданный из части имени файла surrender1 Скриптовые языки администрирования Windows 9 10-10-2013 14:42
CMD/BAT - [решено] Запуск bat-файла от имени админа.Как сделать каталог этого bat-файла текущим?? axmed0207 Скриптовые языки администрирования Windows 1 19-01-2012 06:14
CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла Sarge81 Скриптовые языки администрирования Windows 4 20-09-2011 04:20




 
Переход