View previous topic :: View next topic |
Author |
Message |
zlll
Joined: 01 Dec 2010 Posts: 5
|
(Separately) Posted: Wed Dec 01, 2010 13:22 Post subject: Переименование группы файлов по их дате и времени |
|
|
День добрый.
Честно искал решения задачи, не нашёл. Возможно плохо искал
Задача состоит в следующем. Имеется группа файлов, которые нужно каждый день переименовывать в формат YYYY-MM-DD_HH-MM-SS.mp3. (дата и время должны быть создания или модификации файла)Естественно этот процесс нужно автоматизировать. Решением может быть батник, который будет запускаться по средствам планировщика заданий.
Вопрос, как заставить работать Групповое переименование файлов из тотала, по сохранённому шаблону по средствам командной строки?
Как-то вот так заковыристо.
Помогите пожалуйста
! | Avada: | Заголовок изменён.Тема перенесена из "Общих вопросов" в "Автоматизацию". | |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Wed Dec 01, 2010 13:31 Post subject: |
|
|
zlll
Можно воспользоваться vbs-скриптом. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
zlll
Joined: 01 Dec 2010 Posts: 5
|
(Separately) Posted: Wed Dec 01, 2010 13:50 Post subject: |
|
|
Batya, спасибо
В скрипте используется текущее время и дата, это я так понимаю файлы будут переименованы с датой и временем запуска скрипта, так? Нужно жеж время создания или модификации файлов |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Wed Dec 01, 2010 14:27 Post subject: |
|
|
Если без секунд, можно простенький бат-файлик.
Code: | @echo off
title File Rename YYYY-MM-DD_HH-MM-SS
if -%1==- echo Parameters: %%WL&pause&goto :EOF
if -%1==-go goto process_file
for /f "usebackq delims=" %%f in (`type %1`) do call %0 go "%%f"
goto :EOF
:process_file
set datetime=%~t2
set newname=%datetime:~6,4%-%datetime:~3,2%-%datetime:~0,2%_%datetime:~11,2%-%datetime:~14,2%%~x2
ren %2 %newname% |
Можно как по списку переименовывать - тогда файл списка в параметре, так и по отдельным файлам - тогда в параметрах слово go и имя файла.
Но вопрос - что делать, если файл с новым именем уже существует? Думаю, он касается любого алгоритма. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Wed Dec 01, 2010 15:17 Post subject: |
|
|
zlll wrote: | В скрипте используется текущее время и дата, это я так понимаю файлы будут переименованы с датой и временем запуска скрипта, так? Нужно жеж время создания или модификации файлов |
Прошу прощения.
Действительно тот скрипт делает немного не то, что тебе нужно. Сделал новый:
Code: | '==============================================================
' Переименование файлов\папок в файле-списке по заданной маске.
' Возможные элементы маски (с учётом регистра):
' NNN - имя файла\папки;
' EEE - расширение - только для файлов;
' YYYY - год - 4 цифры;
' YY - год - 2 последние цифры;
' DD - день - всегда 2 цифры;
' D - день - убирается лидирующий 0;
' MM - месяц - всегда 2 цифры;
' M - месяц - убирается лидирующий 0;
' hh - час - всегда 2 цифры;
' h - час - убирается лидирующий 0;
' mm - минута - всегда 2 цифры;
' m - минута - убирается лидирующий 0;
' ss - секунда - всегда 2 цифры;
' s - секунда - убирается лидирующий 0;
' .. - точка (1 символ) - только для файлов;
' ## - при существовании файла\папки маска возвращает следующий номер в виде [N].
'
' Параметры:
' {файл-список} [{режим} [{маска}]]
'
' Здесь {режим} может принимать значения:
' 0 - используется текущая дата-время (по умолчанию),
' 1 - используется дата-время создания файла\папки,
' 2 - используется дата-время модификации файла\папки,
' 3 - используется дата-время доступа файла\папки.
'
' Параметры "режим" и "маска" являются необязательными -
' будет использовано значение по умолчанию.
'
' Пример параметров при вызове из TC:
' %L 1 "NNN_YYYY-MM-DD`hh-mm-ss..EEE"
'==============================================================
Option Explicit
'====== Изменяемые параметры ==================================
' Маска по умолчанию
Const DefaultMask = "NNN_YYYY-MM-DD`hh-mm-ss##..EEE"
Const DefaultMode = 0
'==============================================================
Dim FSO, List, F, Mask, MaskTime, E, Mode, m
Dim NewName, NewNameN, NewNameP
Set FSO = CreateObject("Scripting.FileSystemObject")
Set E = CreateObject("Scripting.Dictionary")
With WScript
List = .Arguments(0)
If .Arguments.Count > 1 Then
Mode = .Arguments(1)
Else
Mode = DefaultMode
End If
If .Arguments.Count > 2 Then
Mask = .Arguments(2)
Else
Mask = DefaultMask
End If
End With
For Each m In Array("YYYY", "YY", "DD", "D", "MM", "M", "hh", "h", "mm", "m", "ss", "s", "NNN", "EEE", "..")
E.Add m, ""
Next
If Mode = 0 Then SetMaskArray1(Now)
For Each F In Split(FSO.OpenTextFile(List).ReadAll, vbNewLine)
If F <> "" Then
SetMaskArray2(F)
NewName = ReplaceAll(Mask, E)
NewNameN = Replace(NewName, "##", "")
NewNameP = FSO.GetParentFolderName(F) & "\" & NewNameN
If (FSO.FileExists(NewNameP) Or FSO.FolderExists(NewNameP)) And (InStr(NewName, "##") > 0) Then
NewNameN = GetNextName(FSO.GetParentFolderName(F), NewName)
End If
If FSO.FileExists(F) Then
FSO.GetFile(F).Name = NewNameN
ElseIf FSO.FolderExists(F) Then
FSO.GetFolder(F).Name = NewNameN
End If
End If
Next
Set E = Nothing
Set FSO = Nothing
WScript.Quit
Function ReplaceAll(pName, pDic)
Dim lK
ReplaceAll = pName
For Each lK In pDic.Keys
ReplaceAll = Replace(ReplaceAll, lK, pDic(lK), 1, -1, 0)
Next
End Function
Sub SetMaskArray1(pMaskTime)
E("YYYY") = Year(pMaskTime)
E("YY" ) = Right(Year(pMaskTime), 2)
E("DD" ) = Right("0" & Day(pMaskTime), 2)
E("D" ) = Day(pMaskTime)
E("MM" ) = Right("0" & Month(pMaskTime), 2)
E("M" ) = Month(pMaskTime)
E("hh" ) = Right("0" & Hour(pMaskTime), 2)
E("h" ) = Hour(pMaskTime)
E("mm" ) = Right("0" & Minute(pMaskTime), 2)
E("m" ) = Minute(pMaskTime)
E("ss" ) = Right("0" & Second(pMaskTime), 2)
E("s" ) = Second(pMaskTime)
End Sub
Sub SetMaskArray2(pPath)
Dim lMaskTime, lF
If FSO.FileExists(pPath) Then
Set lF = FSO.GetFile(pPath)
E("NNN") = FSO.GetBaseName(pPath)
E("EEE") = FSO.GetExtensionName(pPath)
E("..") = "."
ElseIf FSO.FolderExists(pPath) Then
Set lF = FSO.GetFolder(pPath)
E("NNN") = lF.Name
E("EEE") = ""
E("..") = ""
End If
If Mode > 0 Then
Select Case Mode
Case 1 lMaskTime = lF.DateCreated
Case 2 lMaskTime = lF.DateLastModified
Case 3 lMaskTime = lF.DateLastAccessed
End Select
SetMaskArray1(lMaskTime)
End If
Set lF = Nothing
End Sub
Function GetNextName(pPath, pName)
Dim i, lName
i = 0
Do
i = i + 1
lName = Replace(pName, "##", "[" & CStr(i) & "]")
Loop Until Not (FSO.FileExists(pPath & "\" & lName) Or FSO.FolderExists(pPath & "\" & lName))
GetNextName = lName
End Function
|
Есть небольшая проблема. У тебя эти файлы уже с расширением mp3, или расширение нужно тоже задавать?
Дело в том, что в "mp3" входит буква "m", которая является в то же время маской для минут. _________________ Нет, я не сплю. Я просто медленно моргаю.
Last edited by Batya on Wed Dec 01, 2010 15:23; edited 1 time in total |
|
Back to top |
|
|
zlll
Joined: 01 Dec 2010 Posts: 5
|
(Separately) Posted: Wed Dec 01, 2010 15:17 Post subject: |
|
|
MVV
спасибо большое! Как уже преобразовать под наши задачи, будем думать |
|
Back to top |
|
|
zlll
Joined: 01 Dec 2010 Posts: 5
|
(Separately) Posted: Thu Dec 02, 2010 06:37 Post subject: |
|
|
Batya и вам большое спасибо |
|
Back to top |
|
|
Lisabon
Joined: 18 Feb 2011 Posts: 147
|
(Separately) Posted: Fri Feb 18, 2011 00:31 Post subject: Добавление к имени каталога/файла системной даты |
|
|
Собственно необходим скрипт, для автоматизации следующих действий:
к уже существующему каталогу/файлу, у которого уже есть своё произвольное имя, дописать в конце имени каталога/файла нижнее подчёркивание и после системную дату, например, каталог с именем "Downloads" после применения скрипта принял вид вот такой: "Downloads_17.02.2011" , где 17.02.2011 - системная дата день. месяц. год.
Если возможно, то в скрипте предусмотреть параметр, который позволил бы ещё к системной дате приписывать системное время, например, каталог с именем "Downloads" после применения скрипта принял вид вот такой: "Downloads_17.02.2011_22.28.15" , где 17.02.2011 - системная дата, а 22.28.15 - системное время час. мин. сек |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Feb 18, 2011 05:08 Post subject: |
|
|
Скрипт не сложно сделать, но пока рекомендую пару программ, решающих задачу: 1, 2. |
|
Back to top |
|
|
Tol!k
Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Fri Feb 18, 2011 06:33 Post subject: |
|
|
Вообще-то 1, 2
[offtop]
Avada, название темы со скриптом какое-то... не очень
[/offtop] |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Fri Feb 18, 2011 09:20 Post subject: |
|
|
Можно и батником:
Code: | @echo off
if -%1==- echo Parameters: %%WL&pause &goto :EOF
if -%1==-go goto do_work
for /f "usebackq delims=" %%f in (`type %1`) do call %0 go "%%f" %2
pause
goto :EOF
:do_work
set tm=%TIME%
set tm=%tm:~0,2%.%tm:~3,2%.%tm:~6,2%
if "%tm:~0,1%"==" " set tm=0%tm:~1%
set append=%DATE%
if not -%3==- set append=%append%_%tm%
set name=%~dpn2
if "%name:~-1%"=="\" set name=%name:~0,-1%
echo %name%
move "%name%" "%name%_%append%%~x2"
|
Обрабатывает все выделенные папки/каталоги. В строке параметров кнопки нужно указать %WF. Если второй параметр не пуст (т.е. что-то написано через пробел после %WF), то время тоже будет приписываться. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Lisabon
Joined: 18 Feb 2011 Posts: 147
|
(Separately) Posted: Fri Feb 18, 2011 10:45 Post subject: |
|
|
Tol!k wrote: | Вообще-то 1, 2
[offtop]
Avada, название темы со скриптом какое-то... не очень
[/offtop] |
Скрипт от туда помог мне решить задачу как для каталога, так и для файла. Спасибо всем кто откликнулся!!!
Тему можно перенести сюда |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10346 Location: Россия, Саратов
|
(Separately) Posted: Fri Feb 18, 2011 11:51 Post subject: |
|
|
Lisabon wrote: | Тему можно перенести сюда |
Так и сделаем. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
desenntir
Joined: 20 Apr 2011 Posts: 1 Location: Москва
|
(Separately) Posted: Wed Apr 20, 2011 09:54 Post subject: |
|
|
Спасиб за решения пользуюсь vbs-скриптом все четко как мне надо. _________________ не все вечное |
|
Back to top |
|
|
SaDim
Joined: 22 May 2011 Posts: 18
|
(Separately) Posted: Wed Jan 20, 2016 18:08 Post subject: |
|
|
Помогите пожалуйста.
Надо к имени папки (файла) добавлять текущую дату.
Было так xxx (zzz.ini) стало xxx_2016.01.20 (zzz_2016.01.20.ini)
Спасибо. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|