Автоматическое создание папок

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

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

SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

более сложный случай

Сообщение SergM/S »

Batya писал(а):Нечто подобное я уже делал. Теперь немного проще:

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

'=====================================================================
' Создание папки по имени файла и перемещение в нее файла
' Может быть выделено несколько файлов

' Для создания папок в текущей панели
'   в параметрах вызова из TC должно быть прописано:
' %L

' Для создания папок в противоположной панели
'   в параметрах вызова из TC должно быть прописано:
' %L "%T"
'=====================================================================

If WScript.Arguments.Count = 0 Then
  MsgBox "Не указаны параметры!", vbOKOnly + vbError, "Внимание!"
  Wscript.Quit
End If

Dim TempFile, FSO, SelFile
Set FSO      = CreateObject("Scripting.FileSystemObject")
Set TempFile = FSO.OpenTextFile(WScript.Arguments(0), 1)

Dim FileName, FilePath, DashInName, NewFilePath
Do While Not TempFile.AtEndOfStream
  Set SelFile = FSO.GetFile(TempFile.ReadLine)
  FileName    = FSO.GetBaseName(SelFile)
  FilePath    = SelFile.ParentFolder
  If WScript.Arguments.Count > 1 Then
    NewFilePath = WScript.Arguments(1) & FileName
  Else
    NewFilePath = FilePath & "" & FileName
  End If
  If Not FSO.FolderExists(NewFilePath) Then
    FSO.CreateFolder(NewFilePath)
  End If
  If Not FSO.FileExists(NewFilePath & "" & FileName) Then
    FSO.MoveFile SelFile, NewFilePath & ""
  Else
    MsgBox "Уже существует файл " & FileName & " в папке " & NewFilePath, vbOKOnly + vbExclamation, "Внимание!"
  End If
Loop
Set TempFile = Nothing
Set FSO      = Nothing
Set SelFile  = Nothing
Wscript.Quit
а вот у меня наоборот более сложный случай, помогите, плз, если возможно. Как должен выглядеть код, если:
нужно автоматизировать создание папок (и последующее перемещение в них файлов) проименовав их по первой части имени файлов, которая представляет из себя название песни, вторая часть это один из нескольких вариантов и начинается либо с _MIDI либо _AUDIO либо _MPEG. Вот как эту проблему с именами решить?
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Скрипт, вариациями которого я пользуюсь, судя по когда-то вписанному году, уже лет пять. Не совсем то, что Вам надо, т.к. создает только одну папку, но для старта, надеюсь, подойдёт.

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

'  File:         namedir.vbs
'  Version:      1.0 beta
'  Description:  Все файлы выделенные в одном окне передвигаются в новую папку во втором окне с именем
'				 общей части первых двух файлов выделения начиная с начала, если совпадение не находится,
'				 то с именем первого файла в выделении
'  (c) 2004, Lev F

Dim TCS, f, ff, NewDir, FSO, nn, n, counter, fcount, tf
Set TCS = CreateObject("TCScript.Helper")

Set FSO = CreateObject("Scripting.FileSystemObject")

ff = TCS.GetSrcSelectedFiles(-1)
if UBound(ff)=0 Then
   f0=fso.GetBaseName(ff(0))
Else
   f0=FSO.GetFile(ff(0)).Name
   f1=FSO.GetFile(ff(1)).Name
   ln=1
   While Mid(f0,1,ln)=Mid(f1,1,ln)
     ln=ln+1
   wend
   If ln<>1 Then f0=Mid(f0,1,ln)
   lastlet=Mid(f0,ln,1)
   while lastlet="0" Or lastlet="-" Or lastlet="_" Or lastlet="(" Or lastlet="[" Or lastlet=" " Or lastlet="."
      ln=ln-1
      lastlet=mid(f0, ln,1)
      ch=true
   wend
   If ch Then f0=Mid(f0,1,ln)
End If
inp=InputBox ("Enter DirName",,f0)
If inp<>"" then

   NewDir = TCS.GetTrgPath & "\" & inp & "\"
   MsgBox NewDir
   If Not FSO.FolderExists(NewDir) Then FSO.CreateFolder(NewDir)
   For i = 0 to ubound(ff)
      fcount = 1
      Set tf = FSO.GetFile(ff(i))
      Do While FSO.FileExists(NewDir + tf.Name)
         nn = tf.Name
         n = InStrRev(nn, ".")
         If n <> 0 Then
            nn = Left(nn, n - 1)
         End If

         tf.Name = nn & "_" & fcount & "." & FSO.GetExtensionName(tf)
         fcount = fcount + 1
      Loop
      If FSO.fileexists(tf) Then tf.Move NewDir
   Next
   TCS.SendCommand "cm_ClearAll"
End If
Set FSO = Nothing
Set TCS = Nothing
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

Lev писал(а):Скрипт, вариациями которого я пользуюсь, судя по когда-то вписанному году, уже лет пять. Не совсем то, что Вам надо, т.к. создает только одну папку, но для старта, надеюсь, подойдёт.
quote]

Спасибо, Lev, за этот вариант. Но вышепроцитированный мной код мне во всём подходит, кроме одного - он дает имя папке по имени файла отсекая всё от знака "-", а в моём случае надо чтоб отсекалось всё что находится в правой части имени, начиная от слов
"_MIDI" либо "_AUDIO" либо "_MPEG". Подозреваю, что вопрос жутко дилетанский, но я совершенно не в теме. Как это прописать? Через ";" или как ещё?
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Никак не могу понять какие названия файлов и куда их надо пихнуть.
читаю-читаю, а понять не удаётся.
То ли файлы называются
pupkin_midi.aaa
pupkin_audio.bbb
antipupkin_midi.ccc

и надо их распихать по папкам pupkin, antipupkin
То ли по папкам midi, audio
То ли у них названия ещё как-то составлены.
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

Lev писал(а):Никак не могу понять какие названия файлов и куда их надо пихнуть.
читаю-читаю, а понять не удаётся.
То ли файлы называются
pupkin_midi.aaa
pupkin_audio.bbb
antipupkin_midi.ccc

и надо их распихать по папкам pupkin, antipupkin
То ли по папкам midi, audio
То ли у них названия ещё как-то составлены.
первый вариант - понято правильно!
надо их распихать по папкам pupkin, antipupkin
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Lev писал(а):Никак не могу понять какие названия файлов и куда их надо пихнуть.
Как я понял, это:
pupkin1_midi vasya.aaa
pupkin2_audio petya.bbb
pupkin3_mpeg borya.ccc

А переместить надо:
pupkin1\vasya.aaa
pupkin2\petya.bbb
pupkin3\borya.ccc


SergM/S, так?
Если так, то сначала переименуй такие файлы, используя "Групповое переименование" - укажи в поле "Найти:" - "_audio |_mpeg |_midi ", а в поле "Заменить на:" - "-|-|-".
После этого используй скрипт по ранее приведенной ссылке.
Нет, я не сплю. Я просто медленно моргаю.
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

Пытаюсь заниматься самодеятельностью.. получается плохо.
взял за основу код:
'=====================================================================
' Создание папки с частью имени файла, перемещение в нее файла
' Может быть выделено несколько файлов

' В параметрах вызова из TC должно быть прописано:
' %L
'=====================================================================

Dim TempFile, FSO, SelFile
Set TempFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0), 1)
Set FSO = CreateObject("Scripting.FileSystemObject")

Dim MoveFiles, FileName, FilePath, DashInName, NewFilePath, M1, M2, M3, M4
MoveFiles = ""
Do While Not TempFile.AtEndOfStream
Set SelFile = FSO.GetFile(TempFile.ReadLine)
FileName = SelFile.Name
FilePath = SelFile.ParentFolder
DashInName = InstrRev(FileName, "-")
If DashInName <> 0 Then
NewFilePath = FilePath & "\" & Trim(Left(FileName, DashInName - 1))
If Not FSO.FolderExists(NewFilePath) Then
FSO.CreateFolder(NewFilePath)
End If
If Not FSO.FileExists(NewFilePath & "\" & FileName) Then
FSO.MoveFile SelFile, NewFilePath & "\"
MoveFiles = MoveFiles + FileName & chr(13)
Else
M1 = MsgBox("Уже существует файл " & FileName & " в папке " & NewFilePath, vbOKOnly + vbExclamation, "Внимание!")
End If
Else
M2 = MsgBox("Имя исполнителя не выявлено", vbOKOnly + vbExclamation, "Внимание!")
End If
Loop
If MoveFiles <> "" Then
MoveFiles = Left(MoveFiles, Len(MoveFiles) - 1)
M3 = MsgBox("Перемещены файлы:" & chr(13) & MoveFiles, vbOKOnly + vbInformation, "Результат")
Else
M4 = MsgBox("Ни одного файла не перемещено" & chr(13) & MoveFiles, vbOKOnly + vbExclamation, "Внимание!")
End If
Set TempFile = Nothing
Set FSO = Nothing
Set SelFile = Nothing
Wscript.Quit


в строке

DashInName = InstrRev(FileName, "-")

вместо дефиса пытаюсь подставить "midi" "audio" через разные & ; и тд :) кроме выскакивающей ошибки ничего не добился :(
Как правильно написать?
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

[quote="BatyaSergM/S, так?
[/quote]

Не совсем.. проще немного.
Файлы вида
vasya_pupkin_-_nazvanie_pesni_AUDIO.wav
vasya_pupkin_-_nazvanie_pesni_MIDI.mid
petya_pupkin_-_drugaya_pesnya_AUDIO.wav
petya_pupkin_-_drugaya_pesnya_MIDI.mid

распихать по папкам вида

vasya_pupkin_-_nazvanie_pesni
petya_pupkin_-_drugaya_pesnya
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

Т.е. в имени папки должен остаться только исполнитель и название (всё остальное надо отсечь). И по этому признаку рассортировать.

Это ведь не должно быть сложным, надо только как-то вписать в код чтоб отсекались слова MIDI и AUDIO
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

А чем не подходит мой скрипт?
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

Lev писал(а):А чем не подходит мой скрипт?
сорри, я упростил имя, там несколько вариантов аудио, как и миди
AUDIO_1 AUDIO_2 AUDIO_3

т.е. к названию подмешается лишнее.

Так а то о чём я спрашиваю - оно невозможно?
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

SergM/S писал(а):Так а то о чём я спрашиваю - оно невозможно?
Подобное, но в более общем виде я уже просил у Batya.
В твоём конкретном случае, я так понимаю, нужно будет в параметрах передать 0001:

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

vasya_pupkin_-_nazvanie_pesni_AUDIO.wav 
petya_pupkin_-_drugaya_pesnya_MIDI.mid
kolya_pupkin_-_lu4saya_pesnya_blah_blah_blah.blah
     0      0         0      1
vasya_pupkin_-_nazvanie_pesni\vasya_pupkin_-_nazvanie_pesni_AUDIO.wav
petya_pupkin_-_drugaya_pesnya\petya_pupkin_-_drugaya_pesnya_MIDI.mid
kolya_pupkin_-_lu4saya_pesnya\kolya_pupkin_-_lu4saya_pesnya_blah_blah_blah.blah
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

Tol!k писал(а):В твоём конкретном случае, я так понимаю, нужно будет в параметрах передать 0001:
Да!!!!!!!!!

этот вариант подходит!
Жаль, но уровень моей подготовки не позволяет ничего с этим сделать. Я попросту не знаю куда этот кусок кода вписать
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

SergM/S писал(а):вместо дефиса пытаюсь подставить "midi" "audio" через разные & ; и тд Smile кроме выскакивающей ошибки ничего не добился Sad
Как правильно написать?
Так просто не получится. Такой вариант скрипта предполагает разделитель длиной 1 символ.
SergM/S писал(а):Так а то о чём я спрашиваю - оно невозможно?
Вполне выполнимо. Надо только, как всегда, немного подождать ;)
Tol!k писал(а):Подобное, но в более общем виде я уже просил у Batya.
Всё-таки здесь не совсем тот вариант. Как я понимаю, в началах имен файлов может быть неопределенное (и не совпадающее для разных файлов) число разделителей.
Нет, я не сплю. Я просто медленно моргаю.
SergM/S
Сообщения: 11
Зарегистрирован: Ср апр 08, 2009 08:11

Сообщение SergM/S »

Batya писал(а): Вполне выполнимо. Надо только, как всегда, немного подождать ;)
спасибо, это обнадёживает :)
с последним скриптом я действит. поторопился, да, кол-во разделителей может быть разным, не подходит он..
Ответить