Создание папок по списку из текстового файла

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Premix
Сообщения: 6
Зарегистрирован: Чт май 28, 2009 09:54

Создание папок по списку из текстового файла

Сообщение Premix »

В теме Создание папок по списку из указанного файла было показано создание папок из файла с расширением lst.
А можно создать дерево папок, из файла с раширением txt?
К примеру такой:

Код: Выделить всё

[Система]
 
Резервное копирование
Диагностика
Мониторинг
Настройка
Восстановление
 
[Интернет]

Браузеры
Офф-лайн браузеры
Веб ускорители
Анти-спам

[Текст]

Редакторы
Дополнения к Офису
Перевод и распознавание 
Текст
Чтобы было вот так:

Код: Выделить всё

Система
            Резервное копирование
            Диагностика
            Мониторинг
            Настройка
            Восстановление
Интернет
            Браузеры
            Офф-лайн браузеры
            Веб ускорители
            Анти-спам
Текст
            Редакторы
            Дополнения к Офису
            Перевод и распознавание 
            Текст
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

vbs:

Код: Выделить всё

'=====================================================================
' Создание дерева папок из текстового файла вида
' [Родительская папка 1]
'    Дочерняя папка 1
'    ...
'    Дочерняя папка N1
'    ...
' [Родительская папка M]
'    Дочерняя папка 1
'    ...
'    Дочерняя папка NN

' Параметры:
' {файл-список} [{текущая папка}]

' Пример параметров при вызове из TC:
' "C:\Путь\Файл-список.txt" "%P"
'=====================================================================
Option Explicit
Dim CharArr
'======== Изменяемые параметры =======================================
'Массив недопустимых символов имени. Заменяем их указанным ниже символом
CharArr = Split("\ / * ? "" < > | :")
'Символ для замены недопустимого символа
Const ReplaceChar = " "
'Признак автоматической замены недопустимых символов: True\False
Const AutoReplace = False
'=====================================================================

Dim FSO, FF, F, CurrentFolder, ParentFolder, Errors
Set FSO = CreateObject("Scripting.FileSystemObject")

With WScript
  FF = .Arguments(0)
  If .Arguments.Count > 1 Then
    CurrentFolder = .Arguments(1)
  Else
    CurrentFolder = CreateObject("WScript.Shell").CurrentDirectory
  End If
End With
If Right(CurrentFolder, 1) <> "\" Then CurrentFolder = CurrentFolder + "\"

With FSO.OpenTextFile(FF, 1)
  Do While Not .AtEndOfStream
    F = Trim(.ReadLine)
    If F <> "" Then
      If AutoReplace Then F = Trim(ReplaceInadmissibleChars(F))
      If CheckInadmissibleChars(F) Then
        If InStr(F, "[") > 0 Then
          Errors = Errors & vbNewLine & F
        Else
          Errors = Errors & vbNewLine & "[" & ParentFolder & "] -> " & F
        End If
      Else
        If InStr(F, "[") > 0 Then
          ParentFolder = Trim(Mid(F, 2, Len(F) - 2))
          CreateFolder CurrentFolder & ParentFolder
        Else
          CreateFolder CurrentFolder & ParentFolder & "\" & F
        End If
      End If
    End If
  Loop
End With

If Len(Errors) > 0 Then _
  MsgBox "Следующие папки невозможно создать, т.к. в их именах указаны недопустимые символы " &_
         "(""" & Join(CharArr) & """):" & vbNewLine & Errors, _
         vbInformation + vbOKOnly, "Создание дерева папок"

Set FSO = Nothing
Wscript.Quit()

Sub CreateFolder(pPath)
  If Not FSO.FolderExists(pPath) Then FSO.CreateFolder(pPath)
End Sub

Function ReplaceInadmissibleChars(pText)
  Dim lC
  ReplaceInadmissibleChars = pText
  For Each lC In CharArr
    ReplaceInadmissibleChars = Replace(ReplaceInadmissibleChars, lC, ReplaceChar)
  Next
End Function

Function CheckInadmissibleChars(pText)
  Dim lC
  CheckInadmissibleChars = False
  If Not AutoReplace Then
    For Each lC In CharArr
      If InStr(pText, lC) Then
        CheckInadmissibleChars = True
        Exit Function
      End If
    Next
  End If
End Function
Текущая папка для создания дерева задаётся вторым параметром скрипта или используется текущая папка кнопки\команды (параметр "Путь запуска").
Последний раз редактировалось Batya Вт фев 01, 2011 14:33, всего редактировалось 3 раза.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Код: Выделить всё

' "C:\Путь\Файл-список.txt" "%P"
Я бы "%T" написал, без "%P" же и так будет работать.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Flasher
Да, какая разница?
Я же написал:
Batya писал(а):Пример параметров при вызове из TC:
При желании можно указать что угодно.
Может, автору темы выгодней такие параметры:
"%P%N" "C:\Папка"
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Batya
Разница только в том, что не имеет смысла подобный пример приводить, чтобы с толку не сбить пользователя. Иначе он будет писать этот %P, когда он там вовсе не нужен.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Flasher писал(а):Иначе он будет писать этот %P, когда он там вовсе не нужен.
Если создавать кнопку перетаскиванием скрипта на панель, то для работы скрипта нужно прописать, как минимум, один параметр. Пользователю, может быть, проще прописать второй параметр, нежели очищать "Путь запуска".
И, вообще, я, как автор, имею право на собственные примеры. Параметр %P я указал, как наиболее часто употребимый.
Нет, я не сплю. Я просто медленно моргаю.
Premix
Сообщения: 6
Зарегистрирован: Чт май 28, 2009 09:54

Сообщение Premix »

Batya Большое спасибо. Но разъясните пожалуйста:
Создал файл с расширением vbs, скопировал код, вставил, сохранил.
Перетащил на панель TC. В строке Параметры: %P
Файл-список.txt под курсором - жму созданную кнопку. Ошибка.
Как надо правильно?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Batya писал(а):Пользователю, может быть, проще прописать второй параметр, нежели очищать "Путь запуска".
Глупость. Зачем было тогда CurrentDirecroty в коде применять?
Batya писал(а):И, вообще, я, как автор, имею право на собственные примеры.
Имеешь и тебя никто не заставляет, а пишет только своё мнение, как бы он сделал, чтобы ... (уже пояснял что).
Premix писал(а):В строке Параметры: %P

Файл-список.txt под курсором - жму созданную кнопку.
При таком раскладе надо было в параметрах указывать: %P%N либо %P%N "%T"
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Flasher писал(а):Глупость. Зачем было тогда CurrentDirecroty в коде применять?
Да с чего ты решил, что, удобный для тебя вариант обязательно будет также удобен другим?!
Flasher писал(а):Имеешь и тебя никто не заставляет, а пишет только своё мнение, как бы он сделал, чтобы ... (уже пояснял что).
А мне кажется, что передёргивать автора на примерах, а не на реализации - не совсем корректно. Предложи свой вариант реализации, тогда и будет, что обсудить.
Flasher писал(а):Premix писал(а):
В строке Параметры: %P

Файл-список.txt под курсором - жму созданную кнопку.
Это откуда цитировано? Где "Premix писал(а)"?
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Batya писал(а):Да с чего ты решил, что, удобный для тебя вариант обязательно будет также удобен другим?!
Да это ты такой вариант предложил в скрипте. Я только пояснение даю.
Batya писал(а):А мне кажется, что передёргивать автора на примерах, а не на реализации - не совсем корректно. Предложи свой вариант реализации, тогда и будет, что обсудить.
Тут дело не в передёргивании, а в указании на нюансы для юзера. А зачем мне предлагать другие варианты, если твой рабочий? Замени

Код: Выделить всё

If .Arguments.Count > 1 Then 
    CurrentFolder = .Arguments(1) 
  Else 
    CurrentFolder = CreateObject("WScript.Shell").CurrentDirectory 
  End If
на CurrentFolder = .Arguments(1), и лишних разговоров - ноль.
Batya писал(а):Это откуда цитировано? Где "Premix писал(а)"?
Как это где? См. выше.
Premix
Сообщения: 6
Зарегистрирован: Чт май 28, 2009 09:54

Сообщение Premix »

Flasher писал(а):При таком раскладе надо было в параметрах указывать: %P%N либо %P%N "%T"
С параметром %P%N выскакивает окно с ошибкой

Код: Выделить всё

Сценарий:	D:PrоЬаЗ\ТСРU v51\scripts\Создание_папок.vbs
Строка: 51
Символ: 39
Ошибка: Недопустимое имя или номер файла
Код: 800А0034
Источник:	Ошибка выполнения Microsoft VBScript
И папки не создаются. А с параметром %P%N "%T" выскакивает такая же ошибка,но после нажатия "ОК" папки создаются
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Premix
Файл-список при этом под курсором? Всё должно работать без проблем.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Flasher писал(а):Замени
Код:
If .Arguments.Count > 1 Then
CurrentFolder = .Arguments(1)
Else
CurrentFolder = CreateObject("WScript.Shell").CurrentDirectory
End If
на CurrentFolder = .Arguments(1), и лишних разговоров - ноль.
А вот это мне решать. Если не хочешь использовать теукщую папку, указывай второй параметр.
Flasher писал(а):Как это где? См. выше.
Хм. Не заметил.
Premix писал(а):Ошибка: Недопустимое имя или номер файла
Скорее всего на одной из строк находится набор символов, по которому нельзя создать файл - недопустимые символы. Если текстовый файл небольшой, приведи его реальное содержимое.
Premix писал(а):Перетащил на панель TC. В строке Параметры: %P
Файл-список.txt под курсором - жму созданную кнопку. Ошибка.
Как надо правильно?
У скрипта должно быть 2 параметра:
1. Путь к текстовому файлу, по которому создаются папки.
2. Путь к папке, в которой будут создаваться новые папки.
Любой из параметров можно задать жестко, а можно и с помощью специальных параметров TC - %P, %N, %T, %M и т.п. При этом надо учитывать, что путь, содержащий пробелы, должен быть заключён в кавычки. Исключение - конструкции %N, %P%N, %T%M заключать в кавычки не надо - TC самостоятельно добавляет обрамляющие кавычки.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Batya писал(а):А вот это мне решать.
Тебя не понять, то пишешь "Предложи свой вариант реализации", то "мне решать"...
Batya писал(а):У скрипта должно быть 2 параметра
А где в условии скрипта прописано, что только с двумя параметрами будет работать? А то я заметил, что с одним в текущей папке каталоги не создаются. Странно..
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Flasher писал(а):Тебя не понять, то пишешь "Предложи свой вариант реализации", то "мне решать"...
Я говорил про реализацию. Перефразирую: "Поскольку я автор скрипта, то мне решать, что указать в описании. Создай собственный скрипт, тода будет, что обсудить."
Flasher писал(а):А где в условии скрипта прописано, что только с двумя параметрами будет работать?
Здесь:
Batya писал(а):' Параметры:
' {файл-список} [{текущая папка}]
Flasher писал(а):А то я заметил, что с одним в текущей папке каталоги не создаются. Странно..
Отсюда подробней. Покажи кнопку, содержимое файла и как запускается скрипт.
Нет, я не сплю. Я просто медленно моргаю.
Ответить