View previous topic :: View next topic |
Author |
Message |
RyzhkovVA
Joined: 18 Aug 2009 Posts: 2
|
(Separately) Posted: Tue Aug 18, 2009 16:13 Post subject: Групповое переименование |
|
|
Добрый день.
Кто знает помогите пожалуста !
Имеются файлы (ежедневно и много ), переименование происходит по принципу [DMY] [C] 640. Но проблема в том, что я не могу догнать как задать буквенный счетчик с русским алфавитом, а не цифровой. Заранее благодарен за помощь и отклик. |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10268 Location: Россия, Саратов
|
(Separately) Posted: Tue Aug 18, 2009 18:56 Post subject: |
|
|
RyzhkovVA
С кириллицей не работает. Можно с латиницей. Например, в маске указать [N][Ca]. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Wed Aug 19, 2009 10:43 Post subject: |
|
|
RyzhkovVA
Могу написать vbs-скрипт.
Вопросы:
- [DMY] это [DDMMYYYY] ?
- [C] это от "а" до "я" в нижнем регистре?
- Что делать, если количество файлов больше букв алфавита? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
RyzhkovVA
Joined: 18 Aug 2009 Posts: 2
|
(Separately) Posted: Wed Aug 19, 2009 11:51 Post subject: |
|
|
Batya wrote: | Могу написать vbs-скрипт.
Вопросы:
- [DMY] это [DDMMYYYY] ?
- [C] это от "а" до "я" в нижнем регистре?
- Что делать, если количество файлов больше букв алфавита? |
[DMy] [C] 640
[DMy] - это дата (190809)
[C] - это от "А" до "Я" в верхнем регистре.
- За мою практику не встречалось количество файлов превышающее алфовит с одного аппарата ( 640 - это номер аппарата )[/quote]
Буду оооооочень признателен. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Wed Aug 19, 2009 17:03 Post subject: |
|
|
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 |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Wed Aug 19, 2009 17:46 Post subject: |
|
|
Модераторы
Перенесите тему в Автоматизацию.
_________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Дерия
Joined: 14 Oct 2009 Posts: 4
|
(Separately) Posted: Wed Oct 14, 2009 09:22 Post subject: |
|
|
Помогите пожалуйста. Встала задача переименовать файлы по списку. В этом файле есть старое имя и новое. например:
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 |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Wed Oct 14, 2009 10:00 Post subject: |
|
|
Дерия
Старые файлы в TC хоть как-то можно в нужном порядке отсортировать? Каков принцип сортировки? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Дерия
Joined: 14 Oct 2009 Posts: 4
|
(Separately) Posted: Wed Oct 14, 2009 10:20 Post subject: |
|
|
В ТС старые можно хоть как отсортировать можно по имени или по дате, но переименовать только согласно списку.
Например старые отсортированы по имени:
1549.pdf
2346.pdf
8764.pdf
8765.pdf
Но новые будут названы только так
2_1549.pdf
1_2346.pdf
4_8764.pdf
3_8765.pdf |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Wed Oct 14, 2009 13:11 Post subject: |
|
|
Дерия wrote: | В ТС старые можно хоть как отсортировать | Я и хочу понять, каков необходимый тебе принцип сортировки.
Дерия wrote: | переименовать только согласно списку | Как создается этот список? В этом списке только старые имена? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Дерия
Joined: 14 Oct 2009 Posts: 4
|
(Separately) Posted: Wed Oct 14, 2009 13:32 Post subject: |
|
|
Принцип сортировки строго по списку. Возможно в списке будут только старые имена, но тогда новым надо дать имя с префиксом сортировочного числа.
Например в списке идут так
2346.pdf
1549.pdf
8765.pdf
8764.pdf
ВОт мне и нужно чтобы новые были названы так:
1_2346.pdf
2_1549.pdf
3_8765.pdf
4_8764.pdf
Можно сделать что в списке и старые и новые будут, через какой-нибудь разделитель (это правда более трудоемко, я имею ввиду формировать пользователям такой список) . |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Wed Oct 14, 2009 14:33 Post subject: |
|
|
Дерия
Сделал 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 |
|
|
Дерия
Joined: 14 Oct 2009 Posts: 4
|
(Separately) Posted: Wed Oct 14, 2009 15:43 Post subject: |
|
|
Batya
Огромное спасибо!!! Все работает!!! Пользователи в восторге!!!! |
|
Back to top |
|
|
Tol!k
Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Wed Oct 14, 2009 18:01 Post subject: |
|
|
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 |
|
|
|
|
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
|