Переименование группы файлов по их дате и времени
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2, 3, 4, 5  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: Переименование группы файлов по их дате и времени Author: zlll PostPosted: Wed Dec 01, 2010 13:22
    —
День добрый.
Честно искал решения задачи, не нашёл. Возможно плохо искал Smile
Задача состоит в следующем. Имеется группа файлов, которые нужно каждый день переименовывать в формат YYYY-MM-DD_HH-MM-SS.mp3. (дата и время должны быть создания или модификации файла)Естественно этот процесс нужно автоматизировать. Решением может быть батник, который будет запускаться по средствам планировщика заданий.

Вопрос, как заставить работать Групповое переименование файлов из тотала, по сохранённому шаблону по средствам командной строки?
Как-то вот так заковыристо.

Помогите пожалуйста

 !  Avada:
Заголовок изменён.Тема перенесена из "Общих вопросов" в "Автоматизацию".

#2:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Dec 01, 2010 13:31
    —
zlll
Можно воспользоваться vbs-скриптом.

#3:  Author: zlll PostPosted: Wed Dec 01, 2010 13:50
    —
Batya, спасибо
В скрипте используется текущее время и дата, это я так понимаю файлы будут переименованы с датой и временем запуска скрипта, так? Нужно жеж время создания или модификации файлов

#4:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Dec 01, 2010 14:27
    —
Если без секунд, можно простенький бат-файлик.
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 и имя файла.

Но вопрос - что делать, если файл с новым именем уже существует? Думаю, он касается любого алгоритма.

#5:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Dec 01, 2010 15:17
    —
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

#6:  Author: zlll PostPosted: Wed Dec 01, 2010 15:17
    —
MVV
спасибо большое! Как уже преобразовать под наши задачи, будем думать Smile

#7:  Author: zlll PostPosted: Thu Dec 02, 2010 06:37
    —
Batya и вам большое спасибо Smile

#8: Добавление к имени каталога/файла системной даты Author: Lisabon PostPosted: Fri Feb 18, 2011 00:31
    —
Собственно необходим скрипт, для автоматизации следующих действий:

к уже существующему каталогу/файлу, у которого уже есть своё произвольное имя, дописать в конце имени каталога/файла нижнее подчёркивание и после системную дату, например, каталог с именем "Downloads" после применения скрипта принял вид вот такой: "Downloads_17.02.2011" , где 17.02.2011 - системная дата день. месяц. год.

Если возможно, то в скрипте предусмотреть параметр, который позволил бы ещё к системной дате приписывать системное время, например, каталог с именем "Downloads" после применения скрипта принял вид вот такой: "Downloads_17.02.2011_22.28.15" , где 17.02.2011 - системная дата, а 22.28.15 - системное время час. мин. сек

#9:  Author: FlasherLocation: Москва PostPosted: Fri Feb 18, 2011 05:08
    —
Скрипт не сложно сделать, но пока рекомендую пару программ, решающих задачу: 1, 2.

#10:  Author: Tol!kLocation: Арзамас PostPosted: Fri Feb 18, 2011 06:33
    —
Вообще-то 1, 2
[offtop]
Avada, название темы со скриптом какое-то... не очень
[/offtop]

#11:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Feb 18, 2011 09:20
    —
Можно и батником:
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), то время тоже будет приписываться.

#12:  Author: Lisabon PostPosted: Fri Feb 18, 2011 10:45
    —
Tol!k wrote:
Вообще-то 1, 2
[offtop]
Avada, название темы со скриптом какое-то... не очень
[/offtop]


Скрипт от туда помог мне решить задачу как для каталога, так и для файла. Спасибо всем кто откликнулся!!!

Тему можно перенести сюда

#13:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Feb 18, 2011 11:51
    —
Lisabon wrote:
Тему можно перенести сюда

Так и сделаем.

#14:  Author: desenntirLocation: Москва PostPosted: Wed Apr 20, 2011 09:54
    —
Спасиб за решения пользуюсь vbs-скриптом все четко как мне надо.

#15:  Author: SaDim PostPosted: Wed Jan 20, 2016 18:08
    —
Помогите пожалуйста.
Надо к имени папки (файла) добавлять текущую дату.
Было так xxx (zzz.ini) стало xxx_2016.01.20 (zzz_2016.01.20.ini)
Спасибо.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2, 3, 4, 5  Next  :| |:
Page 1 of 5

Powered by phpBB © 2001, 2005 phpBB Group