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, 5  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Flasher



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

Post (Separately) Posted: Mon Jan 24, 2011 16:20    Post subject: Reply with quote

Tol!k
Для порядка вещей, добей, пож., тему кнопкой с абсолютными путями. Wink
Список кидать в противоположную панель. И желательно списки из разных папок отделять пустыми строками.
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Mon Jan 24, 2011 17:48    Post subject: Reply with quote

Jonmey wrote:
И что тут непонятного?

В данном случае всё понятно, но ещё раз прошу обратить внимание, что обсуждение твоей задачи в теме "Создание списка файлов выборочно по расширениям" по сути является оффтопом.
Во избежание ненужных дискуссий, решение твоей задачи в виде vbs-скрипта:
Code:
'=====================================================================
' Создание списка файлов относительно текущей папки

' Параметры:
' {исходный файл-список|папка} {требуемый файл-список}
' Если первым параметром передан путь к папке, то
'   обрабатываеются только эта папка, причём она считается текущей.
' Если для параметра {требуемый файл-список} указан не полный путь, то
'   файл-список создаётся в текущей папке.

' Примеры параметров при вызове из TC:
' %L "C:\Путь\Файл-список.txt"
' %P%N "Файл-список.txt"
'=====================================================================

Dim FSO, FolderMode, FF, F, List, CurrentFolder, TargetList, LenCF
Set FSO = CreateObject("Scripting.FileSystemObject")

FF         = WScript.Arguments(0)
TargetList = WScript.Arguments(1)
FolderMode = FSO.FolderExists(FF)

If FolderMode Then
  CurrentFolder = FF
Else
  CurrentFolder = CreateObject("WScript.Shell").CurrentDirectory
End If
If Right(CurrentFolder, 1) <> "\" Then CurrentFolder = CurrentFolder & "\"
LenCF = Len(CurrentFolder)

If InStr(TargetList, ":") = 0 Then TargetList = CurrentFolder & TargetList

If FolderMode Then
  List = Process(CurrentFolder)
Else
  With FSO.OpenTextFile(FF, 1)
    Do While Not .AtEndOfStream
      F    = .ReadLine
      List = List & Process(F)
    Loop
  End With
End If

FSO.CreateTextFile(TargetList, True, True).Write List

Set FSO = Nothing
Wscript.Quit()

Function Process(pPath)
  Dim lF
  If FSO.FileExists(pPath) Then Process = Cut(pPath)
  If FSO.FolderExists(pPath) Then
    For Each lF in FSO.GetFolder(pPath).Files
      Process = Process & Cut(lF) & vbNewLine
    Next
    For Each lF in FSO.GetFolder(pPath).SubFolders
      Process = Process & Process(lF)
    Next
  End If
End Function

Function Cut(pPath)
  Cut = Mid(pPath, LenCF + 1)
End Function

Внимание! У кнопки\команды параметр "Путь запуска" должен быть пустой.
_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Tue Jan 25, 2011 13:30; edited 1 time in total
Back to top
View user's profile Send private message
dude



Joined: 21 Jan 2011
Posts: 11

Post (Separately) Posted: Mon Jan 24, 2011 17:58    Post subject: Reply with quote

Признаться, не ожидал такой быстрой и продуктивной реакции! Спасибо всем, кто отозвался!
Batya wrote:
Если выделенно несколько каталогов, то списков должно быть несколько (по одному в каждом выделенном каталоге)?

Я имел в виду создание списка файлов по расширению для одного выделенного каталога с подкаталогами в один текст. файл. Сама идея создания отдельных списков для каждого из каталогов (с подкаталогами) интересна, но часто ли подобное нужно? И решается ведь просто созданием списка файлов для каталога следующего уровня все по той же изначальной схеме.

Batya wrote:
Не понял, в каком виде должен быть список.
Варианты:
2.
Code:
Файл1.avi
Подкаталог\Файл2.avi


Вариант 2. Ниже поясню чуть подробнее.

Tol!k, то что Вы предложили, все 3 варианта скрипта — уже отличные рабочие инструменты, спасибо! Но есть пара пожеланий во имя идеала ;)
Проиллюстрирую без лишних слов. Хотелось бы видеть список приблизительно такого вида (опять же формат видео-файлов выбран лишь как образец).
Code:
VIDEO
_COMEDY
  Автостопом по Галактикам.mov
  4 комнаты.avi
и т.д.

_DRAMA
  Вальсирующие.mp4
  Зелёная миля.avi
--MAYA DEREN
   Divine Horsemen — The Living Gods of Haiti.mkv
   Meshes of the Afternoon.mkv
  Зелёная миля.avi
  Рестлер.avi
и т.д.

_ANIMATION
  Mэри и Макс.flv
  Beltesassar's Short Animation Festival.mp4
--НОРШТЕЙН
   Сказка сказок.mov
   Ёжик в тумане.mov
   Шинель.mov
  Трио из Бельвилля.avi
и т.д.

Здесь видно что подкаталоги отделяются "--", или при бОльших вложениях бОльшим числом "-". Сами файлы пробелами. Каталоги с подкаталогами определяются в верхнем регистре, файлы — как есть.
Мне кажется, даже такое простейшее форматирование текста значительно облегчило бы его восприятие.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Mon Jan 24, 2011 18:26    Post subject: Reply with quote

Batya wrote:
Создание списка файлов относительно текущей папки
Я, конечно, извиняюсь, но разве с его задачей скрипт не должен называться "... относительно выделенных папок" ?

Last edited by Flasher on Mon Jan 24, 2011 18:38; edited 1 time in total
Back to top
View user's profile Send private message
Jonmey



Joined: 27 Sep 2010
Posts: 45

Post (Separately) Posted: Mon Jan 24, 2011 18:27    Post subject: Reply with quote

dude
Ваша задача, как мне думается, проще решается с помощью архиваторного плагина Catalog Maker. Настроив его соответствующим образом, и можно получать списки, например, такого вида:
Code:
MOVIE\
   MOVIE\ACTION\
      Film 01.mkv
      Film 02.avi
      Film 03.mkv
   MOVIE\ANIME\
      Film 04.avi
      Film 05.mkv
      Film 06.mpg
   MOVIE\COMEDY\
      Film 07.mkv
      Film 08.avi
      Film 09.mp4
   MOVIE\DRAMA\
      Film 10.avi
      Film 11.mkv
      Film 12.wmv

total files 12


Flasher
Flasher wrote:
Для порядка вещей, добей, пож., тему кнопкой с абсолютными путями.
Список кидать в противоположную панель. И желательно списки из разных папок отделять пустыми строками.

Вроде работает (список файлов выбранных папок с полными путями с выводом на противоположную панель в юникоде):
Code:
TOTALCMD#BAR#DATA
%comspec% /u /c cd.>list.txt&
for /f "delims=" %%d in ('type %WL') do (for /f "delims=" %%f in ('dir/b/s/on/a-d "%%d"') do (set "$f=%%f"&call echo %%$f:/=%%>>"%Tlist.txt"))
%commander_path%\totalcmd.exe,24
выделенное > список с путями

1
-1

Пустые строки не вставляет.


Last edited by Jonmey on Tue Jan 25, 2011 03:56; edited 5 times in total
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Mon Jan 24, 2011 19:01    Post subject: Reply with quote

Flasher wrote:
Я, конечно, извиняюсь, но разве с его задачей скрипт не должен называться "... относительно выделенных папок" ?

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

dude wrote:
Я имел в виду создание списка файлов по расширению для одного выделенного каталога с подкаталогами в один текст. файл.

А я спрашиваю, что делать, если выделено несколько.
Пока не совсем въехал, когда вставлять перед новой папкой пустые строки, а когда - нет. Попробуй пока такой вариант:
Code:
'=====================================================================
' Создание списка файлов относительно текущей папки
'   для заданных расширений файлов

' Параметры:
' {исходный файл-список|папка} {требуемый файл-список} {расширения}
' Если первым параметром передан путь к папке, то
'   обрабатываеются только эта папка, причём она считается текущей.
' Если для параметра {требуемый файл-список} указан не полный путь, то
'   файл-список создаётся в текущей папке.
' Список расширений чередуется символом ","

' Примеры параметров при вызове из TC:
' %L "C:\Путь\Файл-список.txt" "avi,mov,mkv"
' %P%N "Файл-список.txt" "jpeg,bmp"
'=====================================================================

Dim FSO, FolderMode, FF, F, List, CurrentFolder, TargetList, LenCF, EXT, E
Set FSO = CreateObject("Scripting.FileSystemObject")
Set EXT = CreateObject("Scripting.Dictionary")

FF         = WScript.Arguments(0)
TargetList = WScript.Arguments(1)
FolderMode = FSO.FolderExists(FF)
For Each E In Split(WScript.Arguments(2), ",")
  EXT.Add LCase(Trim(E)), ""
Next

If FolderMode Then
  CurrentFolder = FF
Else
  CurrentFolder = CreateObject("WScript.Shell").CurrentDirectory
End If
If Right(CurrentFolder, 1) <> "\" Then CurrentFolder = CurrentFolder & "\"
LenCF = Len(CurrentFolder)

If InStr(TargetList, ":") = 0 Then TargetList = CurrentFolder & TargetList

If FolderMode Then
  List = Process(CurrentFolder, 0)
Else
  With FSO.OpenTextFile(FF, 1)
    Do While Not .AtEndOfStream
      F    = .ReadLine
      List = List & Process(F, 0)
    Loop
  End With
End If

FSO.CreateTextFile(TargetList, True, True).Write List

Set FSO = Nothing
Wscript.Quit()

Function Process(pPath, pLevel)
  Dim lF
  If FSO.FileExists(pPath) Then
    If EXT.Exists(LCase(FSO.GetExtensionName(pPath))) Then Process = Space((pLevel + 1) * 2) & Cut(pPath)
  End If
  If FSO.FolderExists(pPath) Then
    Process = Process & String(pLevel * 2, "-") & UCase(FSO.GetFileName(pPath)) & vbNewLine
    For Each lF in FSO.GetFolder(pPath).Files
      If EXT.Exists(LCase(FSO.GetExtensionName(lF))) Then Process = Process & Space((pLevel + 1) * 2) & Cut(lF) & vbNewLine
    Next
    For Each lF in FSO.GetFolder(pPath).SubFolders
      Process = Process & Process(lF, pLevel + 1)
    Next
  End If
End Function

Function Cut(pPath)
  Cut = FSO.GetFileName(pPath)
End Function

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



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

Post (Separately) Posted: Mon Jan 24, 2011 19:08    Post subject: Reply with quote

Batya wrote:
Не обязательно выделять несколько папок. Работает и с одной папкой.
Было бы странно, если бы работало только с несколькими, но тем не менее в названиях должно быть это важное уточнение. Мне лично исходя из названия было непонятно.
Back to top
View user's profile Send private message
dude



Joined: 21 Jan 2011
Posts: 11

Post (Separately) Posted: Mon Jan 24, 2011 20:58    Post subject: Reply with quote

Batya wrote:
А я спрашиваю, что делать, если выделено несколько.

По логике вещей — создать для каждого из каталогов свой собственный список файлов.

Batya wrote:
Пока не совсем въехал, когда вставлять перед новой папкой пустые строки, а когда - нет.

Между первого уровня вложенности подкаталогами, между под-подкаталогами — без пустой строки.
Или вообще обойтись без этих строк. Ведь идея была в том, чтобы можно было как-то разобраться в каше из файлов и каталогов списка и создать хоть намек на структуру. Я лишь обрисовал один из возможных вариантов структуры списка.

Batya wrote:
Попробуй пока такой вариант:

К сожалению, у меня скрипт выдает ошибку и сразу вылетает.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Mon Jan 24, 2011 21:20    Post subject: Reply with quote

dude wrote:
К сожалению, у меня скрипт выдает ошибку и сразу вылетает.
Т.е. окно с ошибкой даже пропадает?
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 25 Jul 2009
Posts: 664

Post (Separately) Posted: Mon Jan 24, 2011 22:02    Post subject: Reply with quote

А если батник?
Code:
for /r %%i in (*.exe) do Echo %~fi & Pause
?
Для вывода в файл - & Pause заменить на >> имя_файла.txt
Для нескольких папок - цикл с шифтом и проверка if defined
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Mon Jan 24, 2011 22:49    Post subject: Reply with quote

dude wrote:
К сожалению, у меня скрипт выдает ошибку и сразу вылетает.

Перед закрытием окна ошибки нажми Ctrl+C. В буфере окажется текстовое содержимое ошибки. Покажи здесь это текст.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Mon Jan 24, 2011 22:54    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: Tue Jan 25, 2011 06:49    Post subject: Reply with quote

Flasher wrote:
Список кидать в противоположную панель.

Тогда уж м.б. и дополнять, а не заменять?
Code:
TOTALCMD#BAR#DATA
%comspec% /c for /f "delims=" %d in ('chcp 1251^>nul^&type
%WL') do %%comspec%% /c "chcp 1251&(dir/b/s/on/a-d "%%d"&echo:)>>"%Tlist.lst""
%commander_path%\totalcmd.exe,24
всё выделенное >> список с полными путями

1
-1

полные пути, win-1251

*в предыдущих кнопках исправления (№№1,2) и "списки из разных папок отделять пустыми строками" (№3)
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Tue Jan 25, 2011 07:29    Post subject: Reply with quote

Tol!k wrote:
Тогда уж м.б. и дополнять, а не заменять?
Да, такое поведение устроит. Пустые строки можешь сделать между всеми подкаталогами, а не только папками, что в корне?
Back to top
View user's profile Send private message
Jonmey



Joined: 27 Sep 2010
Posts: 45

Post (Separately) Posted: Tue Jan 25, 2011 12:03    Post subject: Reply with quote

Batya
Ваш скрипт работает шикарно. И сортирует все правильно в логическом порядке. Всего пару секунд на 6000 файлов.
Спасибо большое.

А второй (по расширениям) тоже работает без проблем.
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, 5  Next
Page 2 of 5

 
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