Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Групповое переименование

 
Post new topic   This topic is locked: you cannot edit posts or make replies.    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
RyzhkovVA



Joined: 18 Aug 2009
Posts: 2

Post (Separately) Posted: Tue Aug 18, 2009 16:13    Post subject: Групповое переименование Reply with quote

Добрый день.
Кто знает помогите пожалуста !
Имеются файлы (ежедневно и много ), переименование происходит по принципу [DMY] [C] 640. Но проблема в том, что я не могу догнать как задать буквенный счетчик с русским алфавитом, а не цифровой. Заранее благодарен за помощь и отклик.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10250
Location: Россия, Саратов

Post (Separately) Posted: Tue Aug 18, 2009 18:56    Post subject: Reply with quote

RyzhkovVA
С кириллицей не работает. Можно с латиницей. Например, в маске указать [N][Ca].
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Aug 19, 2009 10:43    Post subject: Reply with quote

RyzhkovVA
Могу написать vbs-скрипт.
Вопросы:
- [DMY] это [DDMMYYYY] ?
- [C] это от "а" до "я" в нижнем регистре?
- Что делать, если количество файлов больше букв алфавита?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
RyzhkovVA



Joined: 18 Aug 2009
Posts: 2

Post (Separately) Posted: Wed Aug 19, 2009 11:51    Post subject: Reply with quote

Batya wrote:
Могу написать vbs-скрипт.
Вопросы:
- [DMY] это [DDMMYYYY] ?
- [C] это от "а" до "я" в нижнем регистре?
- Что делать, если количество файлов больше букв алфавита?


[DMy] [C] 640
[DMy] - это дата (190809)
[C] - это от "А" до "Я" в верхнем регистре.
- За мою практику не встречалось количество файлов превышающее алфовит с одного аппарата ( 640 - это номер аппарата )[/quote]
Буду оооооочень признателен.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Aug 19, 2009 17:03    Post subject: Reply with quote

RyzhkovVA
Code:
'=============================================================================
' Переименование выделенных в TC файлов по маске "[DDMMYY] [C] [Add].[E]", где
'   [DDMMYY] - текущая дата;
'   [С]      - счетчик - заглавная буква русского алфавита;
'   [Add]    - любая приставка (передается параметром):
'   [E]      - текущее расширение файла.
'
' Параметры:
' {файл-список\папка} {приставка}
'
' Примеры параметров при вызове из TC:
' %L 640
' "%P" "номер 3"
'
' Автор - Batya
'=============================================================================
Option Explicit
'======== Изменяемые параметры ===============================================
Const FolderRename = False 'Переименовывать ли папки (иначе - файлы в папках)
Const LenYear      = 2     'Количество символов года в маске
Const MoreParams   = True  'Считать все параметры после первого приставкой
Const StartCount   = 192   'Номер первого символа счетчика по кодовой таблице
Const NewFoldCount = True  'Новый счетчик в каждой отдельной папке
'=============================================================================
Dim Mess, FSO, WSH, Errors, FF, Add, F, F1, Counter, CounterG
SetMess
Set FSO    = CreateObject("Scripting.FileSystemObject")
Set WSH    = CreateObject("WScript.Shell")
Set Errors = CreateObject("Scripting.Dictionary")
CheckParam

Counter = 0
If FSO.FolderExists(FF) Then
  If Not FolderRename Then
    For Each F In FSO.GetFolder(FF).Files
      RenameFile F.Path, Counter
      Counter = Counter + 1
    Next
  Else
    RenameFolder FF, Counter
  End If
Else
  For Each F In Split(FSO.OpenTextFile(FF).ReadAll, vbNewLine)
    If F <> "" Then
      F = GetPath(F)
      If Not FSO.FileExists(F) And Not FSO.FolderExists(F) Then
        Errors.Add F, Mess(6)
      Else
        If FSO.FolderExists(F) Then
          If Not FolderRename Then
            If NewFoldCount Then
              CounterG = Counter
              Counter  = 0
            End If
            For Each F1 In FSO.GetFolder(F).Files
              RenameFile F1.Path, Counter
              Counter = Counter + 1
            Next
            If NewFoldCount Then Counter = CounterG
          Else
            RenameFolder F, Counter
          End If
        Else
          RenameFile F, Counter
          Counter = Counter + 1
        End If
      End If
    End If
  Next
End If

If Errors.Count > 0 Then
  MessBox Mess(5) & JoinErr(Errors), 2
Else
  MessBox Mess(4), 3
End If

Quit 0

Sub SetMess
  Set Mess = CreateObject("Scripting.Dictionary")
  With Mess
    .Add 0,  "Переименование файлов по маске"
    .Add 1,  "Не указаны параметры!"
    .Add 2,  "Указанный первый параметр не является ни файлом-списком, ни папкой!"
    .Add 3,  "Файл\папка с подобным именем уже существует"
    .Add 4,  "Операция завершена."
    .Add 5,  "Операция завершена." & vbNewLine & vbNewLine & "Имеются ошибки:"
    .Add 6,  "Файл, либо папка не существуют!"
  End With
End Sub

Sub CheckParam
  Dim l, lCount
  lCount = WScript.Arguments.Count
  If lCount = 0 Then
    MessBox Mess(1), 1
    Quit 0
  End If
  FF = GetPath(WScript.Arguments(0))
  If Not FSO.FileExists(FF) And Not FSO.FolderExists(FF)Then
    MessBox Mess(2), 1
    Quit 0
  End If
  If lCount = 1 Then
    Add = ""
  Else
    If MoreParams Then
      For l = 2 To lCount
        Add = Add & " " & WScript.Arguments(l-1)
      Next
    Else
      Add = " " & WScript.Arguments(1)
    End If
  End If
End Sub

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

Sub RenameFile(pPath, pCounter)
  Dim lNewPath, lCounter, lDate, lDateStr, lExt
  lCounter = Chr(StartCount + pCounter)
  lDate    = Date
  lDateStr = Right("0" & Day(lDate), 2) & Right("0" & Month(lDate), 2) & Right(Year(lDate), LenYear)
  lExt     = FSO.GetExtensionName(pPath)
  lNewPath = FSO.GetParentFolderName(pPath) & "\" & lDateStr & " " & lCounter & Add & "." & lExt
  If FSO.FolderExists(lNewPath) Or FSO.FileExists(lNewPath) Then
    Errors.Add pPath, Mess(3) & " - " & lNewPath
  Else
    On Error Resume Next
    FSO.MoveFile pPath, lNewPath
    If Err.Number <> 0 Then
      Errors.Add pPath, Err.Description
      Err.Clear
    End If
    On Error GoTo 0
  End If
End Sub

Sub RenameFolder(pPath, pCounter)
  Dim lNewPath, lCounter, lDate, lDateStr
  lCounter = Chr(StartCount + pCounter)
  lDate    = Date
  lDateStr = Right("0" & Day(lDate), 2) & Right("0" & Month(lDate), 2) & Right(Year(lDate), LenYear)
  lNewPath = FSO.GetParentFolderName(pPath) & "\" & lDateStr & " " & lCounter & Add
  If FSO.FolderExists(lNewPath) Or FSO.FileExists(lNewPath) Then
    Errors.Add pPath, Mess(3) & " - " & lNewPath
  Else
    On Error Resume Next
    FSO.MoveFolder pPath, lNewPath
    If Err.Number <> 0 Then
      Errors.Add pPath, Err.Description
      Err.Clear
    End If
    On Error GoTo 0
  End If
End Sub

Function JoinErr(pDic)
  Dim lKey
  For Each lKey In pDic
    JoinErr = JoinErr & vbNewLine & lKey & " - " & pDic(lKey)
  Next
End Function

Function MessBox(pMess, pMode)
  Dim lIcon
  Select Case pMode
    Case 1 lIcon = vbCritical    + vbOKOnly
    Case 2 lIcon = vbExclamation + vbOKOnly
    Case 3 lIcon = vbInformation + vbOKOnly
  End Select
  MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function

Sub Quit(pQuitCode)
  Set Mess   = Nothing
  Set WSH    = Nothing
  Set FSO    = Nothing
  Set Errors = Nothing
  WScript.Quit pQuitCode
End Sub

Практический совет - дату лучше писать в формате [YYMMDD], а не [DDMMYY]. Так нормально сортируется, и вообще визуально намного проще ориентироваться.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Aug 19, 2009 17:46    Post subject: Reply with quote

Модераторы
Перенесите тему в Автоматизацию.

 !  CaptainFlint:
Перенёс.

_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Дерия



Joined: 14 Oct 2009
Posts: 4

Post (Separately) Posted: Wed Oct 14, 2009 09:22    Post subject: Reply with quote

Помогите пожалуйста. Встала задача переименовать файлы по списку. В этом файле есть старое имя и новое. например:
    2346.pdf 1_2346.pdf
    1549.pdf 2_1549.pdf
    8765.pdf 3_8765.pdf
    8764.pdf 4_8764.pdf


Сортировка старых имен произвольная абсолютно. Т.е. и не по имени, и не по дате. А вот как есть. Новые имена уже сортированы (для этого добавляется префикс).
Можно это сделать как описывалось в одной из тем через сортировку в Excel, выгрузки новых имен в txt и загрузку списка в групповое переименование. Но дело в том что делать это будет обычный пользователь, который произведя столько телодвижений обязательно ошибётся. Может есть какой нибудь плагин, которому указываешь список, а он сам ищет старый файл в папке и переименовывает в соответствующее новое имя.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Oct 14, 2009 10:00    Post subject: Reply with quote

Дерия
Старые файлы в TC хоть как-то можно в нужном порядке отсортировать? Каков принцип сортировки?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Дерия



Joined: 14 Oct 2009
Posts: 4

Post (Separately) Posted: Wed Oct 14, 2009 10:20    Post subject: Reply with quote

В ТС старые можно хоть как отсортировать можно по имени или по дате, но переименовать только согласно списку.
Например старые отсортированы по имени:

1549.pdf
2346.pdf
8764.pdf
8765.pdf

Но новые будут названы только так

2_1549.pdf
1_2346.pdf
4_8764.pdf
3_8765.pdf
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Oct 14, 2009 13:11    Post subject: Reply with quote

Дерия wrote:
В ТС старые можно хоть как отсортировать
Я и хочу понять, каков необходимый тебе принцип сортировки.

Дерия wrote:
переименовать только согласно списку
Как создается этот список? В этом списке только старые имена?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Дерия



Joined: 14 Oct 2009
Posts: 4

Post (Separately) Posted: Wed Oct 14, 2009 13:32    Post subject: Reply with quote

Принцип сортировки строго по списку. Возможно в списке будут только старые имена, но тогда новым надо дать имя с префиксом сортировочного числа.

Например в списке идут так
2346.pdf
1549.pdf
8765.pdf
8764.pdf

ВОт мне и нужно чтобы новые были названы так:

1_2346.pdf
2_1549.pdf
3_8765.pdf
4_8764.pdf

Можно сделать что в списке и старые и новые будут, через какой-нибудь разделитель (это правда более трудоемко, я имею ввиду формировать пользователям такой список) .
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Oct 14, 2009 14:33    Post subject: Reply with quote

Дерия
Сделал vbs-скрипт для ScriptContentPlugin, который можно использовать в MRT:
Code:
'========== Изменяемые параметры ==============
Const FileList = "C:\FileList.txt" 'Файл-список
'==============================================
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
content = Result
Set FSO = Nothing

Function Result
  Dim List, FF, i
  Result = "==="
  If Not FSO.FileExists(FileList) Then
    Exit Function
  End If
 
  On Error Resume Next
  List = FSO.OpenTextFile(FileList, ForReading, False).ReadAll
  If Err.Number <> 0 Then
    Exit Function
  End If
  On Error GoTo 0
 
  i = 0
  For Each FF In Split(List, vbNewLine)
    i = i + 1
    If LCase(FF) = LCase(FSO.GetFileName(filename)) Then Result = i
  Next
End Function

Установка:
1. Устанавливается указанный плагин.
2. Сохраняем приведённый выше код скрипта под под каким либо именем, например, RowNumInList.vbs.
3. Кладется данный скрипт рядом с файлом плагина.
4. Исправляется инишник плагина script.ini примерно таким образом:
Code:
[Script]
Section=General

[General]
LongName=1
ParseDirs=1
Script=RowNumInList.vbs

5. В TC создаем новый пользовательский набор колонок с колонкой "Result" плагина.

Использование 1:
1. Включаем созданный пользовательский набор колонок.
2. Сортируемся по колонке "Result".
3. Выделяем файлы, которые хотим переименовать.
4. В TC выполняем "Файлы -> Групповое переименование".
5. Указываем шаблон "[C]_[N]".
6. Нажимаем "Выполнить".

Использование 2:
1. Выделяем файлы, которые хотим переименовать.
2. В TC выполняем "Файлы -> Групповое переименование".
3. Указываем шаблон "[=script.Result]_[N]".
4. Нажимаем "Выполнить".

В первом случае номер в начале имени файла будет подставлять TC по порядку, во втором случае номер в начале имени файла будет соответствовать номеру строки в файле-списке.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Дерия



Joined: 14 Oct 2009
Posts: 4

Post (Separately) Posted: Wed Oct 14, 2009 15:43    Post subject: Reply with quote

Batya

Огромное спасибо!!! Все работает!!! Пользователи в восторге!!!!
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Wed Oct 14, 2009 18:01    Post subject: Reply with quote

Batya wrote:
Сделал vbs-скрипт для ScriptContentPlugin...
Ниасилил патамушта многа букф :)
Batya, Avada, извините, не сдержался


Дерия wrote:
Принцип сортировки строго по списку
--------------- Num_FileName.cmd ---------------
Code:
@echo off &chcp 1251 >nul
setlocal enableextensions enabledelayedexpansion
set I=1
for /F "delims=" %%F in (C:\FileList.txt) do (
ren "%%~F" "!I!_%%~F" &set /A I=!I!+1
)


 !  Avada:
В целях приведения к разумному и достаточному минимуму числа открытых тем с заглавием "Групповое переименование" и с некоторыми производными от этого заглавия данная тема закрывается.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies.    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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