Страница 1 из 3

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

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

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

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

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

[Текст]

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

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

Система
            Резервное копирование
            Диагностика
            Мониторинг
            Настройка
            Восстановление
Интернет
            Браузеры
            Офф-лайн браузеры
            Веб ускорители
            Анти-спам
Текст
            Редакторы
            Дополнения к Офису
            Перевод и распознавание 
            Текст

Добавлено: Пн янв 31, 2011 14: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
Текущая папка для создания дерева задаётся вторым параметром скрипта или используется текущая папка кнопки\команды (параметр "Путь запуска").

Добавлено: Пн янв 31, 2011 15:10
Flasher

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

' "C:\Путь\Файл-список.txt" "%P"
Я бы "%T" написал, без "%P" же и так будет работать.

Добавлено: Пн янв 31, 2011 15:24
Batya
Flasher
Да, какая разница?
Я же написал:
Batya писал(а):Пример параметров при вызове из TC:
При желании можно указать что угодно.
Может, автору темы выгодней такие параметры:
"%P%N" "C:\Папка"

Добавлено: Пн янв 31, 2011 15:33
Flasher
Batya
Разница только в том, что не имеет смысла подобный пример приводить, чтобы с толку не сбить пользователя. Иначе он будет писать этот %P, когда он там вовсе не нужен.

Добавлено: Пн янв 31, 2011 15:52
Batya
Flasher писал(а):Иначе он будет писать этот %P, когда он там вовсе не нужен.
Если создавать кнопку перетаскиванием скрипта на панель, то для работы скрипта нужно прописать, как минимум, один параметр. Пользователю, может быть, проще прописать второй параметр, нежели очищать "Путь запуска".
И, вообще, я, как автор, имею право на собственные примеры. Параметр %P я указал, как наиболее часто употребимый.

Добавлено: Пн янв 31, 2011 16:03
Premix
Batya Большое спасибо. Но разъясните пожалуйста:
Создал файл с расширением vbs, скопировал код, вставил, сохранил.
Перетащил на панель TC. В строке Параметры: %P
Файл-список.txt под курсором - жму созданную кнопку. Ошибка.
Как надо правильно?

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

Файл-список.txt под курсором - жму созданную кнопку.
При таком раскладе надо было в параметрах указывать: %P%N либо %P%N "%T"

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

Файл-список.txt под курсором - жму созданную кнопку.
Это откуда цитировано? Где "Premix писал(а)"?

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

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

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

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

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

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

Добавлено: Пн янв 31, 2011 16:55
Flasher
Premix
Файл-список при этом под курсором? Всё должно работать без проблем.

Добавлено: Пн янв 31, 2011 17:03
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 самостоятельно добавляет обрамляющие кавычки.

Добавлено: Пн янв 31, 2011 17:16
Flasher
Batya писал(а):А вот это мне решать.
Тебя не понять, то пишешь "Предложи свой вариант реализации", то "мне решать"...
Batya писал(а):У скрипта должно быть 2 параметра
А где в условии скрипта прописано, что только с двумя параметрами будет работать? А то я заметил, что с одним в текущей папке каталоги не создаются. Странно..

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