Страница 22 из 52
Добавлено: Пн ноя 03, 2014 15:58
Flasher
Роман BY
Можно сохранить шаблон и открывать окно с преднастройками по MULTIRENAME <operation name>. См.
справку или
тут.
Без диалога - уже нужен будет сценарий.
Добавлено: Пн ноя 03, 2014 19:42
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
Групповое переименование
Добавлено: Пт дек 12, 2014 16:15
Pashak
Есть почти 40000 файлов, пример, Колобок БАБА 330.120 котился, нужно изменить - БАБА 330.120 Колобок котился. Возможно ли это? И (или) найти совпадения по цифрам.
Добавлено: Пт дек 12, 2014 17:47
Flasher
Pashak
В справке ищем Подвыражения для поиска+замены.
Найти: (.*) (.*) (.*) (.*)
Заменить: $2 $3 $1 $4
[√] Рег. выраж. [√] Подстан.
Добавлено: Пт фев 06, 2015 03:11
Iori
Добрый День,
Нужно чтобы выбранные папки или файлы содержали точки между словами где пробелы.
Исключение: отсутствие точки после скобки ( и [, и перед ) и ].
То есть:
из
Quick Screen Capture v2 2 0
в
Quick.Screen.Capture.v2.2.0
из
терминатор 2 судный день (1991) .avi
в
терминатор.2.судный.день.(1991).avi
из
Можно этого добится через инструмент группового переименования, но по мне скрипт в виде кнопки куда удобние.
Трудно будет такой сделать?
Добавлено: Пт фев 06, 2015 14:51
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)
Добавлено: Пт фев 06, 2015 18:23
Iori
Serge Yolkin
Спасибо.
Скрипт выдаёт ошибку.
Line 3
Char 2
Error: Synstax error
code: 800A03EA
Source Microsoft JScript compilation error.
Добавлено: Пн фев 09, 2015 18:09
Serge Yolkin
Выдаёт.
Но не выдавал.
Попробую позже разобраться.
Добавлено: Пн фев 09, 2015 18:13
Flasher
Serge Yolkin
А как же исключения внутри скобок ([ * ]) ?
Для замены одного символа и регулярки не нужны...
Добавлено: Пн фев 09, 2015 18:37
Serge Yolkin
Flasher,
не, это я поторопился. Тут и парочка старых скриптов на ХР заглючили...
Добавлено: Пн фев 09, 2015 22:09
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+)([^\)|^\]])
По числу символов одинаково, так что - без разницы.
Добавлено: Вт фев 10, 2015 00:00
Iori
Flasher
Огромное Спасибо !!! Скрипт просто класс.
Я так понимаю что скрипт универсален, и его можно подогнать ко многим случаем.
А как вы указали пробел в
А где можно почитать что это всё значит? А то у меня появилось несколько идей

Добавлено: Вт фев 10, 2015 00:27
Flasher
Iori
Пожалуйста.

В общем-то, он универсален в рамках регекспов. Где о них почитать на форуме сообщалось многократно, в т.ч. и в этой теме. Да банально забить в гугле само понятие и посмотреть. Для составления полно сервисов:
1,
2,
3,
4 и т.д. Что касается работы с vbs/js, то самое неглядное пособие - это
детище небезызвестного Шуры Асябрика (Tweak TС, TrashReg и т.д.).
Добавлено: Вт фев 10, 2015 00:28
Вахмурка
А как вы указали пробел
\s
А где можно почитать что это всё значит?
Как обычно
Добавлено: Вт фев 10, 2015 13:15
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