Пакетное создание файлов, целостность последовательности
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3  :| |:
Total Commander -> Автоматизация Total Commander

#31:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Dec 17, 2008 15:36
    —
Готов новый vbs-скрипт с автоматическим определением приставки и окончания по первому элементу списка:
Code:
'==============================================================================
' Формирование списка отсутствующих в последовательности элементов
' Вид числовой последовательности определяется по первому элементу списка

' Параметры:
' 1 - Исходный файл-список (обязат.   )
' 2 - Выходный файл-список (не обязат.)
' 3 - Режим:               (не обязат.)
'     0 - вывести на экран - по умолчанию,
'     1 - записать в файл,
'     2 - по недостающим элементам создать папки,
'     3 - по недостающим элементам создать пустые файлы
'==============================================================================
Option Explicit
Dim Dic, FSO, List, l, i, Prefix, Postfix, LenPrefix, LenPostfix
Dim InFile, OutFile, Mode, Str, Value, Position, Digits, Num, Mess
Set Dic = CreateObject("Scripting.Dictionary")
Set FSO = CreateObject("Scripting.FileSystemObject")

'Задаем массив сообщений
MessDefine
'Проверяем параметры
CheckParams
'Читаем исходный список
List = Split(FSO.OpenTextFile(InFile).ReadAll, vbNewLine)
'Ищем в первом элементе число
Value  = Search(List(0), "\d+", Position)
Digits = Len(Value)
'Если первый элемент не содержит цифр, выходим
If Position = 0 Then Quit
'Определяем приставку и окончание
Prefix     = Left(List(0), Position - 1     )
Postfix    = Mid (List(0), Position + Digits)
LenPrefix  = Len (Prefix )
LenPostfix = Len (Postfix)
'Перебираем список
For Each l In List
  'Проверяем на совпадение приставки и окончания
  If (UCase(Left (l, LenPrefix )) = UCase(Prefix )) And _
     (UCase(Right(l, LenPostfix)) = UCase(Postfix)) Then
    'Средняя часть (цифры)
    Num = Mid(l, Position, Len(l) - LenPrefix - LenPostfix)
    'Проверяем среднюю часть на минимальное количество цифр
    If Len(Num) >= Digits And _
       IsNumeric(Num)     Then
      'Добавляем в искомый массив
      Dic.Add CInt(Num), l
    End If
  End If
Next
'Задаем числовую последовательность от минимума до максимума
For i = Min(Dic.Keys) To Max(Dic.Keys)
  'Проверяем наличие элемента с текущим числом
  If Not Dic.Exists(i) Then
    'Формируем среднюю часть с лидирующими нулями
    If Len(i) < Digits Then
      Num = Right(String(Digits, "0") & i, Digits)
    Else
      Num = i
    End If
    'Заполняем строковой массив
    Str = Str & vbNewLine & Prefix & Num & Postfix
  End If
Next
'Убираем лидирующий перенос строки
Str = Mid(Str, Len(vbNewLine) + 1)

'Результаты в зависимости от заданного режима
Select Case Mode
  Case 0  MsgBox Str, vbInformation + vbOKOnly, Mess(0)
  Case 1  FSO.CreateTextFile(OutFile, True).Write Str
  Case 2  CreateFolders Split(Str, vbNewLine)
  Case 3  CreateFiles   Split(Str, vbNewLine)
End Select

'Выход
Quit

'===== Процедуры и функции ====================================================
'Проверка входных параметров
Sub CheckParams
  With WScript
    If .Arguments.Count = 0 Then
      MsgBox Mess(1), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    InFile = .Arguments(0)
    If Not FSO.FileExists(InFile) Then
      MsgBox Mess(2), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    OutFile = ""
    If .Arguments.Count > 1 Then
      OutFile = .Arguments(1)
    End If
    Mode = 0
    If .Arguments.Count > 2 Then
      Mode = .Arguments(2)
      If IsNumeric(Mode) Then
        Mode = CInt(Mode)
        If (Mode < 0) Or (Mode > 3) Then Mode = 0
      Else
        Mode = 0
      End If
    End If
    If (Mode <> 0) And (OutFile = "") Then
      MsgBox Mess(3), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
  End With
End Sub

'Описание сообщений
Sub MessDefine
  Set Mess = CreateObject("Scripting.Dictionary")
  With Mess
    .Add 0,  "Отсутствующие элементы списка"
    .Add 1,  "Не указаны параметры!"
    .Add 2,  "Указанный файл-список не существует!"
    .Add 3,  "Для данного режима должен быть указан выходной файл-список!"
  End With
End Sub

'Поиск по маске первого значения в строке
'Функция возвращает значение, третий параметр - позицию
Function Search(pStr, pMask, byRef pPos)
  Dim REx, lMatch, lMatches
  Set REx        = New RegExp
  REx.Pattern    = pMask
  REx.IgnoreCase = True
  REx.Global     = True
  Set lMatches   = REx.Execute(pStr)
  If lMatches.Count > 0 Then Set lMatch = lMatches.Item(0)
  If IsObject(lMatch) Then
    Search = lMatch.Value
    pPos   = lMatch.FirstIndex + 1
  Else
    Search = ""
    pPos   = 0
  End If
End Function

'Создание папок по списку
Sub CreateFolders(pList)
  Dim l
  For Each l In pList
    If Not(FSO.FolderExists(l) And FSO.FileExists(l)) Then
      FSO.CreateFolder l
    End If
  Next
End Sub

'Создание пустых файлов по списку
Sub CreateFiles(pList)
  Dim l
  For Each l In pList
    If Not(FSO.FolderExists(l) And FSO.FileExists(l)) Then
      FSO.CreateTextFile l
    End If
  Next
End Sub

'Поиск максимального значения в массиве
Function Max(pArr)
  Dim lE, lM
  lM = pArr(0)
  For Each lE In pArr
    If lE > lM Then lM = lE
  Next
  Max = lM
End Function

'Поиск минимального значения в массиве
Function Min(pArr)
  Dim lE, lM
  lM = pArr(0)
  For Each lE In pArr
    If lE < lM Then lM = lE
  Next
  Min = lM
End Function

'Выход
Sub Quit
  Set Mess = Nothing
  Set Dic  = Nothing
  Set FSO  = Nothing
  WScript.Quit
End Sub

#32:  Author: _Johm PostPosted: Wed Dec 17, 2008 19:50
    —
Batya, великолепный скрипт.

если встречается вот такое:
pre_10_post.test
pre_011_post.test
pre_11_post.test
pre_12_post.test

то выдает ошибку
Code:
Строка: 47
Символ: 7
Ошибка: Запись уже связана с элементом данного семейства
Код: 800A01C9
Источник: Ошибка выполнения Microsoft VBScript


Хотел было уже прикрутить к Sequences, но выделение в режиме плагина не передает все элементы, передает имя группы элементов.

#33:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Dec 18, 2008 11:17
    —
_Johm
Хм... Продолжаем уточнять условия задачи.
Question Что, в твоем понимании, должно получаться, если исходная последовательность выглядит так:
Code:
pre_10_post.test
pre_011_post.test
pre_13_post.test
pre_015_post.test


_Johm wrote:
выделение в режиме плагина не передает все элементы, передает имя группы элементов.

Ничего не понял. О чем речь? У меня Sequences не стоит, и ставить его я не собираюсь.
Объясни подробно, как ты действуешь и что хочешь в итоге получить.

#34:  Author: _Johm PostPosted: Tue Dec 23, 2008 11:43
    —
Batya wrote:
_Johm
Хм... Продолжаем уточнять условия задачи.
Что, в твоем понимании, должно получаться, если исходная последовательность выглядит так:
Код:
pre_10_post.test
pre_011_post.test
pre_13_post.test
pre_015_post.test

В данном случае все работает как надо, ошибка когда есть два файла с "одинаковым" числом (11 и 011). В данном случае может создавать второй список с названием "Возможные дубликаты"?

На счет плагина Sequences
он представляет в панеле файлы в виде
a[05-11]
a[13-14]

когда в панеле изначально
...
a09
a10
a11
-пропущенный 12-ый-
a13
a14

плагин объединяет только файлы с одинаковым по длинне именем.

Batya wrote:
Johm писал(а):
выделение в режиме плагина не передает все элементы, передает имя группы элементов.

Я думал, что плагин передает в выделение файлы как есть (тогда можно было бы направить это выделение в скрипт. Но
он передает выделение в сгруппированном виде.

Batya wrote:
У меня Sequences не стоит, и ставить его я не собираюсь.
Объясни подробно, как ты действуешь и что хочешь в итоге получить.

Так то плагин удобный. Все что хотел уже получил - задача решена.
Далее, разве что, можно добавить обход нештатной ситуации с "возможными дубликатами"
Еще раз спасибо за скрипт.

#35:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Dec 23, 2008 13:50
    —
_Johm
Опять я ничего не понял.
Раз ты не ответил на мой предыдущий вопрос, усложню ситуацию.
Question Что, в твоем понимании, должно получаться, если исходная последовательность выглядит так:
Code:
pre_10_post.test
pre_11_post.test
pre_011_post.test
pre_13_post.test
pre_015_post.test
Не надо описывать словами. Просто приведи перечень элементов последовательности.

_Johm wrote:
Так то плагин удобный. Все что хотел уже получил - задача решена.
Очень хорошо. Тогда я и голову не буду ломать, пытаясь догадаться о твоих желаниях.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3  :| |:
Page 3 of 3

Powered by phpBB © 2001, 2005 phpBB Group