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 

Script Request
Goto page Previous  1, 2, 3 ... 8, 9, 10 ... 40, 41, 42  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Batya



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

Post (Separately) Posted: Mon Feb 02, 2009 13:55    Post subject: Reply with quote

gumanok wrote:
Теперь нужно запихать файл на несколько уровней поглубже.

vbs:
Code:
'==============================================================================
' Создание дерева папок согласно разделителя в имени файла.
' В именах создаваемых папок первый символ делается заглавным.
' Например,если разделитель "_", а имя файла "abc_de_fghi_jk.ext", то
'   будет создано "Abc\De\Fghi\jk.ext".

' Параметры:
' {список файлов} [{целевая папка} [{режим} [{разделители}]]]
' где {режим} по разрядам может принимать значения:
'   1-й разряд цифр:
'     1 - копирование (по умолчанию},
'     2 - перемещение;
'   2-й разряд цифр:
'     1 - переименовывать файл (по умолчанию},
'     2 - не переименовывать.
' Если не указана {целевая папка}, то используется папка файла.
' Можно указать несколько разделителей, перечислив их через символ "\"

' Пример параметров вызова из TC:
' %L "%T" 22 "_\-\test"

' Автор - Batya
'==============================================================================
Option Explicit
'================= Изменяемые параметры =======================================
Const DefaultMode       = 11    'Режим по умолчанию
Const UpperCaseMode     = True  'Изменять ли регистр первого символа имени папки
Const DefaultSeparators = "_\-" 'Разделители по умолчанию
'==============================================================================
Dim FSO, FileList, TargetDir, Mode, Separators, Mess, WSH, F, NameArr, r, i, S
Dim Path, Name, FullPath

SetMess
Set WSH = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
CheckParam
For Each F In Split(FSO.OpenTextFile(FileList).ReadAll, vbNewLine)
  If F = "" Then Exit For
  NameArr = FSO.GetBaseName(F)
  For Each S In Separators
    NameArr = Replace(NameArr, S, vbNewLine)
  Next
  NameArr = Split(NameArr, vbNewLine)
  If TargetDir = "" Then
    Path = FSO.GetAbsolutePathName(FSO.GetParentFolderName(F))
  Else
    Path = TargetDir
  End If
  r = UBound(NameArr)
  On Error Resume Next
  For i = 0 To r - 1
    Name = NameArr(i)
    If Name <> "" Then
      If UpperCaseMode Then Name = UCase(Left(Name,1)) & Mid(Name, 2)
      Path = Path & "\" & Name
      If Not FSO.FolderExists(Path) Then FSO.CreateFolder Path
      If Err.Number <> 0 Then
        MessBox Mess(5) & vbNewLine & Err.Description, 1
        Err.Clear
        Quit
      End If
    End If
  Next
  If Rank(Mode, 2) = 2 Then NameArr(r) = FSO.GetBaseName(F)
  FullPath = Path & "\" & NameArr(r) & "." & FSO.GetExtensionName(F)
  Select Case Rank(Mode, 1)
    Case 1 FSO.CopyFile F, FullPath
    Case 2 FSO.MoveFile F, FullPath
  End Select
  If Err.Number <> 0 Then
    MessBox Mess(5) & vbNewLine & Err.Description, 1
    Err.Clear
    Quit
  End If
  On Error GoTo 0
Next

MessBox Mess(6), 3

Quit

Sub CheckParam
  If WScript.Arguments.Count = 0 Then
    MessBox Mess(1), 1
    Quit
  End If
  FileList = WScript.Arguments(0)
  If Not FSO.FileExists(FileList) Then
    MessBox Mess(2), 1
    Quit
  End If
  If WScript.Arguments.Count > 1 Then
    TargetDir = WScript.Arguments(1)
    If Not TargetDir = "" Then
      TargetDir = GetPath(TargetDir)
      If Not FSO.FolderExists(TargetDir) Then
        MessBox Mess(3), 1
        Quit
      End If
    End If
  Else
    TargetDir = ""
  End If
  If WScript.Arguments.Count > 2 Then
    Mode    = WScript.Arguments(2)
    If Mode = "" Then Mode = DefaultMode
    If IsNumeric(Mode) Then
      Mode = CInt(Mode)
    Else
      MessBox Mess(4), 1
      Quit
    End If
    If Not(Rank(Mode,1) = 1 Or Rank(Mode,1) = 2) Then
      MessBox Mess(4), 1
      Quit
    End If
    If Not(Rank(Mode,2) = 1 Or Rank(Mode,2) = 2) Then
      MessBox Mess(4), 1
      Quit
    End If
  Else
    Mode = DefaultMode
  End If
  If WScript.Arguments.Count > 3 Then
    S = WScript.Arguments(3)
  Else
    S = ""
  End If
  If S = "" Then S = DefaultSeparators
  Separators = Split(S, "\")
End Sub

Sub SetMess
  Set Mess = CreateObject("Scripting.Dictionary")
  Mess.Add 0,  "Создание дерева папок"
  Mess.Add 1,  "Не указаны входные параметры!"
  Mess.Add 2,  "Файл-список не существует!"
  Mess.Add 3,  "Целевая папка не существует!"
  Mess.Add 4,  "Неправильно указан режим работы скрипта!"
  Mess.Add 5,  "Операция прервана по причине ошибки:"
  Mess.Add 6,  "Операция завершена."
End Sub

Function MessBox(pMess, pMode)
  Dim lIcon
  Select Case pMode
    Case 1 lIcon = vbCritical    + vbOKOnly
    Case 2 lIcon = vbExclamation + vbOKOnly
    Case 3 lIcon = vbInformation + vbOKOnly
    Case 4 lIcon = vbExclamation + vbOKCancel
  End Select
  MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

Function Rank(pNumber, pPosition)
  Rank = Left(Right(pNumber, pPosition), 1)
End Function

Sub Quit
  Set Mess = Nothing
  Set FSO  = Nothing
  Set WSH  = Nothing
  WScript.Quit
End Sub

Добавлено:
- возможность не переименовывать файл;
- возможность задать несколько разделителей;
- несколько разделителей подряд обрабатываются, как один.
_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Wed Apr 15, 2009 17:23; edited 2 times in total
Back to top
View user's profile Send private message
gumanok



Joined: 27 Jan 2009
Posts: 8

Post (Separately) Posted: Mon Feb 02, 2009 16:45    Post subject: Reply with quote

С ума сойти! Работает, как часы! Спасибо огромное!
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Fri Feb 06, 2009 01:30    Post subject: Reply with quote

Batya, сделай пожалуйста, чтоб из имени "abc_de_fghi_jk.ext" создавалось "abc_de\abc_de_fghi_jk.ext"

Ну а если можно будет выбрать
Code:
• "abc_de\abc_de_fghi_jk.ext"
• "abc\abc_de_fghi_jk.ext"
• "abc\de\abc_de_fghi_jk.ext"
• "abc\de\fghi\abc_de_fghi_jk.ext"
будет вообще сказка Rolling Eyes
PS
- количество разделителей может оказаться от 1 до 5
- разделитель может оказаться "сдвоенным" abc_de_fghi__jk.ext ,но считать его нужно за один
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Fri Feb 06, 2009 10:32    Post subject: Reply with quote

Tol!k
Необходима чёткая формализация задачи.

Правильно ли я понял? ...
1. Нужно задавать возможность оставить имя файла прежним. Делать это передаваемым параметром или константой в скрипте?
2. Нужна возможность задания начального и конечного индекса при обработке имени файла по разделителю? Делать это передаваемыми параметрами или константами в скрипте?

Tol!k wrote:
- количество разделителей может оказаться от 1 до 5
А это мне каким боком надо учесть?
Tol!k wrote:
- разделитель может оказаться "сдвоенным" abc_de_fghi__jk.ext ,но считать его нужно за один
Ну, с этим все понятно.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Fri Feb 06, 2009 19:21    Post subject: Reply with quote

Batya
1. Оставить имя файла прежним и не заморачиваться. Файлы перемещать.
2. Нужна возможность задания порядкового номера разделителя, который при обработке имени файла будет преобразован в "\". Делать это передаваемыми параметром, например так
Code:
01  для получения      abc_de\abc_de_fghi_jk.ext
1   для получения         abc\abc_de_fghi_jk.ext
111 для получения abc\de\fghi\abc_de_fghi_jk.ext
011 для получения abc_de\fghi\abc_de_fghi_jk.ext

PS
Batya wrote:
Tol!k wrote:
- количество разделителей может оказаться от 1 до 5
А это мне каким боком надо учесть?

Ну, обрабатывать имя "abc_de_fghi.ext" если параметрах задано 111 из пункта №2 так, будто задано 11 (110)
Можно добавить параметр "строгое соответствие", при указании которого совсем не обрабатывать файлы, количество разделителей в которых меньше, чем в маске из пункта №2. Т.е. пропускать файлы "abc_de.ext" и "abc_de_fghi.ext" если указана маска 111
PPS
Разделителем м.б. "_" и "-"
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Sat Mar 28, 2009 22:28    Post subject: Reply with quote

Up
?
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Sat Mar 28, 2009 22:41    Post subject: Reply with quote

Tol!k
Ты не ответил:
Batya wrote:
1. Нужно задавать возможность оставить имя файла прежним. Делать это передаваемым параметром или константой в скрипте?

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



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Thu Apr 09, 2009 17:27    Post subject: Reply with quote

Batya wrote:
Ты не ответил

Tol!k wrote:
1. Оставить имя файла прежним и не заморачиваться.

Мне вообще не нужно изменять имена файлов. Просто создавать новые папки и перемещать в них файлы с оригинальными именами.
Но если тебе обязательно "нужно задавать возможность оставить имя файла прежним", то лучше это сделать передаваемым параметром.
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Fri Apr 10, 2009 00:45    Post subject: Reply with quote

Tol!k wrote:
- разделитель может оказаться "сдвоенным" abc_de_fghi__jk.ext ,но считать его нужно за один

Tol!k wrote:
1. Оставить имя файла прежним и не заморачиваться.

Tol!k wrote:
Разделителем м.б. "_" и "-"

Готово.

Tol!k wrote:
2. Нужна возможность задания порядкового номера разделителя, который при обработке имени файла будет преобразован в "\". Делать это передаваемыми параметром

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



Joined: 16 Jul 2009
Posts: 16

Post (Separately) Posted: Thu Jul 16, 2009 19:48    Post subject: Reply with quote

Batya

vbs-скрипт, использующий Script Helper:
[code]'=======================================================
' Создание текстового файла с содержимым буфера обмена
'=======================================================

Спасибо Batya всё работает!

Но есть пару вопросов:
Можно так что бы текстовый фал создавался не в той дирректории
откуда запустился сам скрипт а в любой папке на активной панели?
И если можно то было бы не плохо давать динамическое имя файлу
например по двум первым словам из текста - как в Word ?
Спасибо.
_________________
universal007
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2586
Location: Большая деревня Москва

Post (Separately) Posted: Thu Jul 16, 2009 20:03    Post subject: Reply with quote

Batya молодец, спору нет. Но xxcopy это умеет не хуже, причем как "туда", так и "обратно". Называется это flatten subdirectories. Подробности здесь.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
universal007



Joined: 16 Jul 2009
Posts: 16

Post (Separately) Posted: Thu Jul 16, 2009 20:28    Post subject: Reply with quote

Вахмурка wrote:
Но xxcopy это умеет не хуже


Спасибо за быстрый ответ но, к сожалению я в англицком не силён.
Если не трудно опишите подробней сам процес.
К тому же скрипт я сделал на выполнение кнопкой из панели TC.
_________________
universal007
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2586
Location: Большая деревня Москва

Post (Separately) Posted: Thu Jul 16, 2009 21:17    Post subject: Reply with quote

Ну, во-первых, есть электронные переводчики. Язык там хороший, правда, автор изредка шутит и использует витиеватые гиперболы. Но редко.

Во-вторых, вкратце суть в следующем. Запуская xxcopy с одним(-ими) ключом(-ами), преобразуем файл c:\One\Two.txt (c:\One - это путь) в файл c'One'Two.txt, где путь "зашит" в имени. Другой ключ (или ключи) производят обратный процесс. Проверял - работает. Символ-разделитель задается.

Чтобы понять, достаточно посмотреть пару "командная строка - примеры". Почти все и так ясно.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Sat Jul 18, 2009 23:13    Post subject: Reply with quote

universal007 wrote:
Можно так что бы текстовый фал создавался не в той дирректории
откуда запустился сам скрипт а в любой папке на активной панели?
Очисти в кнопке "Путь запуска"
universal007 wrote:
И если можно то было бы не плохо давать динамическое имя файлу
например по двум первым словам из текста - как в Word ?

В скрипте после "If Len(Clip) > 0 Then" напиши:
Code:
FileName = Left(Clip, InStr(Clip, " ") - 1)

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



Joined: 16 Jul 2009
Posts: 16

Post (Separately) Posted: Sun Jul 19, 2009 07:23    Post subject: Reply with quote

Batya wrote:
В скрипте после "If Len(Clip) > 0 Then" напиши:


Спасибо сработало, но теперь у меня создаётся файл с именем по первому слову из текста но без расширения.
Какая команда отвечает за расширение?
И если не трудно - подскажите где поискать описание команд при создании подобных скриптов?
_________________
universal007
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 ... 8, 9, 10 ... 40, 41, 42  Next
Page 9 of 42

 
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