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 

Нужен скрипт "поиск+переименование+перенос"
Goto page Previous  1, 2, 3, 4  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Petr_Ch



Joined: 02 Feb 2013
Posts: 17

Post (Separately) Posted: Tue Feb 12, 2013 13:37    Post subject: Reply with quote

Flasher
Поставил курсор на корневую 1111...

Скрипт сработал при чёткой структуре папок типа:
C:\temp\11111111111\2\pic\0001.jpg

Но в реальности папки могут называться совершенно по разному. Неизменно только их положение относительно друг друга и название последней папки "pic".

Тоесть при структуре типа
C:\temporary\oneoneone\two\pic\0001.jpg
скрипт уже не работает.

Полагаю я некорректно расписал пример. Вот корректный.
...XXX\Z\pic\0001.jpg
XXX - произвольный путь.

У вас в скрипте Z принимается за номер, но это может быть и "1", и "2", и "ff", и "jp71" и т.д.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Tue Feb 12, 2013 14:01    Post subject: Reply with quote

Petr_Ch wrote:
У вас в скрипте Z принимается за номер, но это может быть и "1", и "2", и "ff", и "jp71" и т.д.
Естественно, об этом надо было писать заранее, потому что подтверждением очевидности постоянства имён папок является нумерация. В названии чётко написано "..\\pic\ в корень выбранной папки с переименованием их по шаблону _имя". Другими словами, поставленную ранее задачу я выполнил.
В новой достаточно убрать 16 и 21 строки.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Wed Feb 13, 2013 18:10    Post subject: Reply with quote

Petr_Ch wrote:
Batya
Выделять пробовал самые разные папки. Не помогает.


Хм... Да, были косяки.
Переписал скрипт полностью:
Code:
'======================================================================
' Для каждой папки из файла-списка перемещаются и переименовываются
' вложенные файлы - {Имя выделенной папки}_{Имя файла}.{Расширение}
'
' Параметры:
' {файл-список}
'
' Пример параметров при вызове из TC:
' %L
'======================================================================
Option Explicit
Dim EXT
Set EXT = CreateObject("Scripting.Dictionary")
'========== Изменяемые параметры ======================================
Const BasePath = "C:\Temp\" 'Пусть для перемещения файлов
'Массив расширений обрабатываемых файлов
EXT.Add "jpg", ""
EXT.Add "tif", ""
'======================================================================

Dim FSO, FF, F, SF

With WScript
  If .Arguments.Count = 0 Then
    MsgBox "Не заданы параметры!", vbOKOnly + vbCritical, "Перемещение вложенных файлов"
    .Quit
  End If
  FF = .Arguments(0)
End With

Set FSO = CreateObject("Scripting.FileSystemObject")

With FSO.OpenTextFile(FF, 1)
  Do While Not .AtEndOfStream
    F = Trim(.ReadLine)
    If F <> "" Then
      If FSO.FolderExists(F) Then
        On Error Resume Next
        MoveFromFolder FSO.GetFolder(F), F
        Err.Clear
        On Error GoTo 0
      End If
    End If
  Loop
  .Close
End With

Set FSO = Nothing
Set EXT = Nothing
WScript.Quit

Sub MoveFromFolder(pSubFolder, pFolder)
  Dim lF
  For Each lF In pSubFolder.Files
    MoveFile lF, pFolder
  Next
  For Each lF In pSubFolder.SubFolders
    MoveFromFolder lF, pFolder
  Next
End Sub

Sub MoveFile(pFile, pFolder)
  Dim lF, lE
  lF = BasePath & FSO.GetBaseName(pFolder) & "_" & pFile.Name
  lE = LCase(FSO.GetExtensionName(pFile.Path))
  If EXT.Exists(lE) Then FSO.MoveFile pFile.Path, lF
End Sub

Выделять нужно папки. Уровень вложенности у папок может быть любой. Новые имена файлов получают приставку именно от имён выделенных папок (если не удобно, могу переделать).
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Petr_Ch



Joined: 02 Feb 2013
Posts: 17

Post (Separately) Posted: Fri Feb 15, 2013 14:54    Post subject: Reply with quote

Batya

Большое спасибо! Работает. Very Happy

Только я заменил "_" на "#".
Вот зачем:

Провёл я, предположим, мою гипотетическую обработку и снова собраны у меня все файлы рядом с папками, от которых к ним дописаны имена.
Пример:
c:\temp\XXXX\out
c:\temp\YYYY\out
c:\temp\XXXX#01.jpg
c:\temp\XXXX#02_add.jpg
c:\temp\XXXX#03.jpg
c:\temp\YYYY#01.jpg
c:\temp\YYYY#02.jpg
c:\temp\YYYY#03.jpg

Теперь эти файлы надо вложить в папки
c:\temp\XXXX\out\
c:\temp\YYYY\out\
Причём файлы кладутся в те папки, с которыми имена до знака "#" совпадают с названием папки. И именно в подпапку out.

В итоге файлы должны оказаться:
c:\temp\XXXX_01\out\XXXX#01.jpg
c:\temp\XXXX_01\out\XXXX#02_add.jpg
c:\temp\XXXX_01\out\XXXX#03.jpg
c:\temp\YYYY_01\out\YYYY#01.jpg
c:\temp\YYYY_01\out\YYYY#02.jpg
c:\temp\YYYY_01\out\YYYY#03.jpg

Можно такое реализовать?
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Fri Feb 15, 2013 15:41    Post subject: Reply with quote

Petr_Ch wrote:
c:\temp\XXXX\out
c:\temp\YYYY\out

Petr_Ch wrote:
c:\temp\XXXX_01\out\XXXX#01.jpg

Не понял. Папки XXXX и YYYY должны при этом переименовываться?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Feb 15, 2013 16:04    Post subject: Reply with quote

Petr_Ch
>
Flasher wrote:
В новой достаточно убрать 16 и 21 строки.

Неужели не работает?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Fri Feb 15, 2013 17:06    Post subject: Reply with quote

Petr_Ch wrote:
Причём файлы кладутся в те папки, с которыми имена до знака "#" совпадают с названием папки. И именно в подпапку out.

Нечто похожее есть - Создание дерева папок согласно разделителя в имени файла\папки.
Только поменяй строку:
Code:
  If Rank(Mode, 2) = 2 Then NameArr(r) = BaseName

на
Code:
  If Rank(Mode, 2) = 2 Then NameArr(r) = "out\" & BaseName


Параметры вызова:
%L C:\Temp 22 "#"

Выделять нужно файлы.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Petr_Ch



Joined: 02 Feb 2013
Posts: 17

Post (Separately) Posted: Sun Feb 17, 2013 16:24    Post subject: Reply with quote

Flasher
Удаление строчек не помогло((

Batya
Спасибо за второй скрипт. То что надо.

И последний штрих.
Можете к нему добавить функцию автоматического переименования уже перенесенных файлов по счётчику? Чтобы в в каждой папке файлы начинались с 0001, 0002, 0003 и т.д. ?
Это уже умеет делать ваш скрипт, но незнаю как его со здешним скриптом подружить.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Feb 17, 2013 16:35    Post subject: Reply with quote

Petr_Ch wrote:
Удаление строчек не помогло((
Petr_Ch wrote:
C:\temporary\oneoneone\two\pic\0001.jpg
скрипт уже не работает.
Убеждаемся, что в папке temporary ещё нет папки с новым именем, ставим курсор на oneoneone, потом уже нажимаем кнопку.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Sun Feb 17, 2013 18:44    Post subject: Reply with quote

Petr_Ch wrote:
Можете к нему добавить функцию автоматического переименования уже перенесенных файлов по счётчику?

Ко второму скрипту, т.е. к обратному переносу?
Petr_Ch wrote:
Чтобы в в каждой папке файлы начинались с 0001, 0002, 0003 и т.д. ?

Именно, начинались? Количество цифр в приставке 4?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Petr_Ch



Joined: 02 Feb 2013
Posts: 17

Post (Separately) Posted: Sun Feb 17, 2013 20:51    Post subject: Reply with quote

Batya
Не "начинались", а вообще были бы названы по счётчику. Тоесть приобрели бы конечный вид из четырех цифр. Пример:
0001.jpg
0002.jpg
0003.jpg
0004.jpg

И в каждой папке счётчик начинается с еденицы (0001).
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Mon Feb 18, 2013 10:23    Post subject: Reply with quote

Petr_Ch
А папка out перед запуском скрипта пустая? Т.е. нужно переносимые файлы именовать c 0001 и далее?
Или там уже что-то лежит, и нужно начинать именовать переносимые файлы после уже существующих?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Petr_Ch



Joined: 02 Feb 2013
Posts: 17

Post (Separately) Posted: Mon Feb 18, 2013 11:45    Post subject: Reply with quote

Batya
Да. Все ауты пустые.
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Mon Feb 18, 2013 18:17    Post subject: Reply with quote

Petr_Ch
Не хочется приводить весь немного переделанный скрипт под твои частные задачи.
Итак, частями...
1. Объявляем ещё одну переменную j:
Code:
Dim Path, Name, FullPath, SepPos, SepPosArr, IsFolder, BaseName, j

2. После For Each F In Split(FSO.OpenTextFile(FileList).ReadAll, vbNewLine) пишем
Code:
  j = j + 1

3. Вместо
Code:
  If Rank(Mode, 2) = 2 Then NameArr(r) = "out\" & BaseName

пишем
Code:
  NameArr(r) = "out\" & Right(String(4, "0") & j, 4)

Сам не тестировал, но должно быть всё ОК.
По-хорошему, можно ещё несколько строк проверок и улучшалок добавить, но ты, скорее всего, никогда и не попадёшь в проблемный вариант (например, количество файлов больше 9999).
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Petr_Ch



Joined: 02 Feb 2013
Posts: 17

Post (Separately) Posted: Mon Feb 18, 2013 18:58    Post subject: Reply with quote

Batya
Работает, но нумерация идёт сквозной.
Тоесть в одной папке она закончилась на 0007, в следующем ауте продолжается 0008, 0009 и т.д.
А надо чтобы в каждом с 0001 начиналась.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3, 4  Next
Page 3 of 4

 
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