Групповое переименование

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

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

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Роман BY
Можно сохранить шаблон и открывать окно с преднастройками по MULTIRENAME <operation name>. См. справку или тут.
Без диалога - уже нужен будет сценарий.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
helb
Сообщения: 57
Зарегистрирован: Ср окт 08, 2014 21:46

Сообщение helb »

Часто требуется быстренько добавить префикс к именам группы файлов. Для того чтобы делать это быстрее чем встроенным групповым переименованием и не мусорить в его истории по-мелочам, а главное с именем файла под курсором в качестве шаблона. Выделяем нужное, опционально ставим курсор на файл, уже содержащий нужный текст, запускаем (к примеру, Ctrl+Shift+M), правим текст/вводим новый.
Можно добавлять как префикс так и суффикс, вместе и по отдельности — разделитель ‹:›

affix-rename.vbs:

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

'===============================================================
' Affix rename (by helb)
' Add prefix and/or suffix to each file/dir in a list (UTF-16 encoded): 
' ‘:’ — prefix-suffix separator (e.g. “:suffix” or “prefix:suffix”)
' Добавляет префикс и/или суффикс к каждому файлу/папке в списке
' ‘:’ — разделитель префикса и суффикса
'
' Parameters: <listfile (UTF-16)> [<suggestion>]
' Total Commander parameters: %WL "%O"
'===============================================================
Option Explicit 
dim FSO, F, fobj, name, prefix, suffix, list, confirmed
set FSO = CreateObject("Scripting.FileSystemObject") 

if WScript.Arguments.length = 0 then
	WScript.Echo("No parameters specified")
	WScript.Quit
end if
if FSO.FileExists(WScript.Arguments(0)) then
	List = WScript.Arguments(0)
else
	WScript.Echo("No list")
	WScript.Quit
end if

if WScript.Arguments(1) <> "" then name = WScript.Arguments(1)
name = InputBox("Enter affix (use ‘:’ to denote suffix)", "Rename", name)
if name = "" then WScript.Quit

name = Split(name, ":")
prefix = name(0)
if Ubound(name) < 1 then suffix = "" else suffix = name(1)

for each F in Split(FSO.OpenTextFile(List, 1, false, -1).ReadAll, vbNewLine)
	if F <> "" then
		set fobj = getObj(F)
		if not fobj is nothing then
			name = fobj.ParentFolder.Path & "\" & prefix & FSO.GetBaseName(F) & suffix & "." & FSO.GetExtensionName(F)
			if objExists(name) > 0 and confirmed = Empty then
				confirmed = MsgBox("Name conflict. Overwrite all? (“No” to skip all)" & vbCrLf & "Note: overwriting folders will delete contents", vbExclamation + vbYesNoCancel, "Confirm")
				if confirmed = vbCancel then exit for
			end if
			if objExists(name) > 0 and confirmed = vbYes or objExists(name) = 0 then
				if objExists(name) > 0 then getObj(name).Delete
				fobj.Move(name)
			end if
		end if
	end if
next

WScript.Quit

function getObj(fl)
	if FSO.FileExists(fl) then
		set getObj = FSO.GetFile(fl)
	elseif FSO.FolderExists(fl) then
		set getObj = FSO.GetFolder(fl)
	else
		set getObj = nothing
	end if
end function

'0=not exists, 1=is file, 2=is folder
function objExists(name)
	if FSO.FileExists(name) then 
		objExists = 1
	elseif FSO.FolderExists(name) then
		objExists = 2
	else
		objExists = 0
	end if
end function

function getNewName(name)
	if Right(name, Len(ext)) = ext then getNewName = Left(name, Len(name) - Len(ext)) else getNewName = name & ext
end function
Pashak
Сообщения: 1
Зарегистрирован: Пт дек 12, 2014 15:59

Групповое переименование

Сообщение Pashak »

Есть почти 40000 файлов, пример, Колобок БАБА 330.120 котился, нужно изменить - БАБА 330.120 Колобок котился. Возможно ли это? И (или) найти совпадения по цифрам.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Pashak
В справке ищем Подвыражения для поиска+замены.
Найти: (.*) (.*) (.*) (.*)
Заменить: $2 $3 $1 $4
[√] Рег. выраж. [√] Подстан.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Добрый День,

Нужно чтобы выбранные папки или файлы содержали точки между словами где пробелы.
Исключение: отсутствие точки после скобки ( и [, и перед ) и ].

То есть:
из
Quick Screen Capture v2 2 0
в
Quick.Screen.Capture.v2.2.0
из
терминатор 2 судный день (1991) .avi
в
терминатор.2.судный.день.(1991).avi
из


Можно этого добится через инструмент группового переименования, но по мне скрипт в виде кнопки куда удобние.

Трудно будет такой сделать?
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Для параметра %S:

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

<job>
  <object id="f" progid="Scripting.FileSystemObject" />
  <script type="text/jscript" language="JScript"><![CDATA[
    var a=WScript.Arguments,b,c='';
    for(var i=0;i<a.length;i++){
      if(f.fileExists(a(i)))b=f.getFile(a(i));
      else if(f.folderExists(a(i)))b=f.getFolder(a(i));
      b.name=a(i).replace(/\s+/g,'.');
    }
  ]]></script>
</job>
(формат .wsf)
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Serge Yolkin

Спасибо.

Скрипт выдаёт ошибку.

Line 3
Char 2
Error: Synstax error
code: 800A03EA
Source Microsoft JScript compilation error.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Выдаёт.
Но не выдавал.
Попробую позже разобраться.
Последний раз редактировалось Serge Yolkin Пн фев 09, 2015 18:36, всего редактировалось 1 раз.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
А как же исключения внутри скобок ([ * ]) ?
Для замены одного символа и регулярки не нужны...
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Flasher,
не, это я поторопился. Тут и парочка старых скриптов на ХР заглючили...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
Ладно, я чего-то подустал ждать.

Iori

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

'============================== VBS =============================
' Переименовать выбранные элементы с помощью регулярных выражений

' Параметры: %WL <строка поиска> <строка замены>
' /i  —  ключ отключения зависимости от регистра
'================================================================
Option Explicit
Dim C, List, S, R, REx, F, N, IsFold, Ln, BN, Ext, Path, FN, i
With WSH.Arguments
  C = .UnNamed.Count : If C = 0 Then WSH.Quit
  If C <> 3 Then MsgBox "Следует указать 3 параметра!",_
  4144, Space(12) & "Ошибка вводных данных" : WSH.Quit
  List = .Item(0) : S = .Item(1) : R = .Item(2)
  C = .Named.Exists("i")
End With: Set REx = New RegExp: REx.Global = 1
REx.Pattern = S : If C Then REx.IgnoreCase = 1

With CreateObject("Scripting.FileSystemObject")
  Set List = .OpenTextFile(List,,,-1)
  Do : F = List.ReadLine : N = .GetFileName(F) : IsFold = Right(F, 1) = "\"
    If IsFold Then Ln = Len(F) - 1 : BN = N Else Ln = Len(F) :_
    BN = .GetBaseName(F) : Ext = .GetExtensionName(F) :_
    If Len(Ext) Then Ext = "." & Ext
    Path = "\\?\" & .GetParentFolderName(F) & "\"
    If Ln > 259 Then F = "\\?\" & F
    BN = REx.Replace(BN, R) : FN = BN & Ext : i = 0
    While (.FileExists(Path & FN) OR .FolderExists(Path & FN)) And FN <> N
    i = i + 1 : FN = BN & " (" & i & ")" & Ext : Wend : If FN <> N Then _
    If IsFold Then .GetFolder(F).Name = FN Else .GetFile(F).Name = FN
  Loop Until List.AtEndOfStream
End With : CreateObject("WScript.Shell").SendKeys "^r"
Параметры для запрошенного случая: %WL ([^\(|^\[])(\s+)((?!\)|\])) $1.$3
Строка поиска ещё может быть такой: ([^\(|^\[])(\s+)([^\)|^\]])
По числу символов одинаково, так что - без разницы.
Последний раз редактировалось Flasher Вт фев 17, 2015 18:43, всего редактировалось 2 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Flasher

Огромное Спасибо !!! Скрипт просто класс.

Я так понимаю что скрипт универсален, и его можно подогнать ко многим случаем.

А как вы указали пробел в

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

([^\(|^\[])(\s+)((?!\)|\]))
А где можно почитать что это всё значит? А то у меня появилось несколько идей :)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori
Пожалуйста. :wink:
В общем-то, он универсален в рамках регекспов. Где о них почитать на форуме сообщалось многократно, в т.ч. и в этой теме. Да банально забить в гугле само понятие и посмотреть. Для составления полно сервисов: 1, 2, 3, 4 и т.д. Что касается работы с vbs/js, то самое неглядное пособие - это детище небезызвестного Шуры Асябрика (Tweak TС, TrashReg и т.д.).
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

А как вы указали пробел
\s
А где можно почитать что это всё значит?
Как обычно
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Iori писал(а):в виде кнопки куда удобнее.
Можно создать в тотале именованный шаблон группового переименования (в данном примере он назван "Точки между словами, где пробелы") и применять его (для выбранных элементов) с помощью кнопки на TCFS2:

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef "set_ini(`%COMMANDER_PATH%\usercmd.ini`, em_temp, cmd,
`MULTIRENAME Точки между словами, где пробелы`) tem(em_temp) delay(500) send(`{ENTER}`, findwnd(`TMultiRename`)) delay(500) send(`{ESC}`, findwnd(`TMultiRename`))"
WCMICONS.DLL,46
Мультипереименовать по шаблону "Точки между словами, где пробелы"


-1
Ответить