Для порядка вещей, добей, пож., тему кнопкой с абсолютными путями.
Список кидать в противоположную панель. И желательно списки из разных папок отделять пустыми строками.
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
В данном случае всё понятно, но ещё раз прошу обратить внимание, что обсуждение твоей задачи в теме "Создание списка файлов выборочно по расширениям" по сути является оффтопом.Jonmey писал(а):И что тут непонятного?
Код: Выделить всё
'=====================================================================
' Создание списка файлов относительно текущей папки
' Параметры:
' {исходный файл-список|папка} {требуемый файл-список}
' Если первым параметром передан путь к папке, то
' обрабатываеются только эта папка, причём она считается текущей.
' Если для параметра {требуемый файл-список} указан не полный путь, то
' файл-список создаётся в текущей папке.
' Примеры параметров при вызове из 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
Я имел в виду создание списка файлов по расширению для одного выделенного каталога с подкаталогами в один текст. файл. Сама идея создания отдельных списков для каждого из каталогов (с подкаталогами) интересна, но часто ли подобное нужно? И решается ведь просто созданием списка файлов для каталога следующего уровня все по той же изначальной схеме.Batya писал(а):Если выделенно несколько каталогов, то списков должно быть несколько (по одному в каждом выделенном каталоге)?
Вариант 2. Ниже поясню чуть подробнее.Batya писал(а):Не понял, в каком виде должен быть список.
Варианты:
2.Код: Выделить всё
Файл1.avi Подкаталог\Файл2.avi
Код: Выделить всё
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
и т.д.
Я, конечно, извиняюсь, но разве с его задачей скрипт не должен называться "... относительно выделенных папок" ?Batya писал(а):Создание списка файлов относительно текущей папки
Код: Выделить всё
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 писал(а):Для порядка вещей, добей, пож., тему кнопкой с абсолютными путями.
Список кидать в противоположную панель. И желательно списки из разных папок отделять пустыми строками.
Код: Выделить всё
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Не обязательно выделять несколько папок. Работает и с одной папкой. Но, на мой взгляд, ключевым является то, что путь файла в списке отражается относительным.Flasher писал(а):Я, конечно, извиняюсь, но разве с его задачей скрипт не должен называться "... относительно выделенных папок" ?
А я спрашиваю, что делать, если выделено несколько.dude писал(а):Я имел в виду создание списка файлов по расширению для одного выделенного каталога с подкаталогами в один текст. файл.
Код: Выделить всё
'=====================================================================
' Создание списка файлов относительно текущей папки
' для заданных расширений файлов
' Параметры:
' {исходный файл-список|папка} {требуемый файл-список} {расширения}
' Если первым параметром передан путь к папке, то
' обрабатываеются только эта папка, причём она считается текущей.
' Если для параметра {требуемый файл-список} указан не полный путь, то
' файл-список создаётся в текущей папке.
' Список расширений чередуется символом ","
' Примеры параметров при вызове из 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
По логике вещей — создать для каждого из каталогов свой собственный список файлов.Batya писал(а):А я спрашиваю, что делать, если выделено несколько.
Batya писал(а):Пока не совсем въехал, когда вставлять перед новой папкой пустые строки, а когда - нет.
К сожалению, у меня скрипт выдает ошибку и сразу вылетает.Batya писал(а):Попробуй пока такой вариант:
Код: Выделить всё
for /r %%i in (*.exe) do Echo %~fi & PauseТогда уж м.б. и дополнять, а не заменять?Flasher писал(а):Список кидать в противоположную панель.
Код: Выделить всё
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