Страница 3 из 4
Добавлено: Вт фев 12, 2013 13:37
Petr_Ch
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" и т.д.
Добавлено: Вт фев 12, 2013 14:01
Flasher
Petr_Ch писал(а):У вас в скрипте Z принимается за номер, но это может быть и "1", и "2", и "ff", и "jp71" и т.д.
Естественно, об этом надо было писать заранее, потому что подтверждением очевидности постоянства имён папок является нумерация. В названии чётко написано "
..\№\pic\ в корень выбранной папки с переименованием их по шаблону №_имя". Другими словами, поставленную ранее задачу я выполнил.
В новой достаточно убрать 16 и 21 строки.
Добавлено: Ср фев 13, 2013 18:10
Batya
Petr_Ch писал(а):Batya
Выделять пробовал самые разные папки. Не помогает.
Хм... Да, были косяки.
Переписал скрипт полностью:
Код: Выделить всё
'======================================================================
' Для каждой папки из файла-списка перемещаются и переименовываются
' вложенные файлы - {Имя выделенной папки}_{Имя файла}.{Расширение}
'
' Параметры:
' {файл-список}
'
' Пример параметров при вызове из 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
Выделять нужно папки. Уровень вложенности у папок может быть любой. Новые имена файлов получают приставку именно от имён выделенных папок (если не удобно, могу переделать).
Добавлено: Пт фев 15, 2013 14:54
Petr_Ch
Batya
Большое спасибо! Работает.
Только я заменил "_" на "#".
Вот зачем:
Провёл я, предположим, мою гипотетическую обработку и снова собраны у меня все файлы рядом с папками, от которых к ним дописаны имена.
Пример:
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
Можно такое реализовать?
Добавлено: Пт фев 15, 2013 15:41
Batya
Petr_Ch писал(а):c:\temp\XXXX\out
c:\temp\YYYY\out
Petr_Ch писал(а):c:\temp\XXXX_01\out\XXXX#01.jpg
Не понял. Папки XXXX и YYYY должны при этом переименовываться?
Добавлено: Пт фев 15, 2013 16:04
Flasher
Petr_Ch
>
Flasher писал(а):В новой достаточно убрать 16 и 21 строки.
Неужели не работает?
Добавлено: Пт фев 15, 2013 17:06
Batya
Petr_Ch писал(а):Причём файлы кладутся в те папки, с которыми имена до знака "#" совпадают с названием папки. И именно в подпапку out.
Нечто похожее есть -
Создание дерева папок согласно разделителя в имени файла\папки.
Только поменяй строку:
Код: Выделить всё
If Rank(Mode, 2) = 2 Then NameArr(r) = BaseName
на
Код: Выделить всё
If Rank(Mode, 2) = 2 Then NameArr(r) = "out" & BaseName
Параметры вызова:
%L C:\Temp 22 "#"
Выделять нужно файлы.
Добавлено: Вс фев 17, 2013 16:24
Petr_Ch
Flasher
Удаление строчек не помогло((
Batya
Спасибо за второй скрипт. То что надо.
И последний штрих.
Можете к нему добавить функцию автоматического переименования уже перенесенных файлов по счётчику? Чтобы в в каждой папке файлы начинались с 0001, 0002, 0003 и т.д. ?
Это уже умеет делать
ваш скрипт, но незнаю как его со здешним скриптом подружить.
Добавлено: Вс фев 17, 2013 16:35
Flasher
Petr_Ch писал(а):Удаление строчек не помогло((
Petr_Ch писал(а):C:\temporary\oneoneone\two\pic\0001.jpg
скрипт уже не работает.
Убеждаемся, что в папке temporary ещё нет папки с новым именем, ставим курсор на
oneoneone, потом уже нажимаем кнопку.
Добавлено: Вс фев 17, 2013 18:44
Batya
Petr_Ch писал(а):Можете к нему добавить функцию автоматического переименования уже перенесенных файлов по счётчику?
Ко второму скрипту, т.е. к обратному переносу?
Petr_Ch писал(а):Чтобы в в каждой папке файлы начинались с 0001, 0002, 0003 и т.д. ?
Именно, начинались? Количество цифр в приставке 4?
Добавлено: Вс фев 17, 2013 20:51
Petr_Ch
Batya
Не "начинались", а вообще были бы названы по счётчику. Тоесть приобрели бы конечный вид из четырех цифр. Пример:
0001.jpg
0002.jpg
0003.jpg
0004.jpg
И в каждой папке счётчик начинается с еденицы (0001).
Добавлено: Пн фев 18, 2013 10:23
Batya
Petr_Ch
А папка out перед запуском скрипта пустая? Т.е. нужно переносимые файлы именовать c 0001 и далее?
Или там уже что-то лежит, и нужно начинать именовать переносимые файлы после уже существующих?
Добавлено: Пн фев 18, 2013 11:45
Petr_Ch
Batya
Да. Все ауты пустые.
Добавлено: Пн фев 18, 2013 18:17
Batya
Petr_Ch
Не хочется приводить весь немного переделанный скрипт под твои частные задачи.
Итак, частями...
1. Объявляем ещё одну переменную j:
Код: Выделить всё
Dim Path, Name, FullPath, SepPos, SepPosArr, IsFolder, BaseName, j
2. После For Each F In Split(FSO.OpenTextFile(FileList).ReadAll, vbNewLine) пишем
3. Вместо
Код: Выделить всё
If Rank(Mode, 2) = 2 Then NameArr(r) = "out\" & BaseName
пишем
Код: Выделить всё
NameArr(r) = "out\" & Right(String(4, "0") & j, 4)
Сам не тестировал, но должно быть всё ОК.
По-хорошему, можно ещё несколько строк проверок и улучшалок добавить, но ты, скорее всего, никогда и не попадёшь в проблемный вариант (например, количество файлов больше 9999).
Добавлено: Пн фев 18, 2013 18:58
Petr_Ch
Batya
Работает, но нумерация идёт сквозной.
Тоесть в одной папке она закончилась на 0007, в следующем ауте продолжается 0008, 0009 и т.д.
А надо чтобы в каждом с 0001 начиналась.