Создание кнопки автоматического переименования

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

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

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

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

Гм. Все супер. Только в ТЗ было:
Tol!k писал(а): в буфере обмена: приставка;
.
Ключевое слово - в БУФЕРЕ обмена.
Аватара пользователя
LocKtaR-o-DarK
Сообщения: 349
Зарегистрирован: Пт авг 12, 2005 04:20
Откуда: Москва
Контактная информация:

Сообщение LocKtaR-o-DarK »

Tol!k
ну что же, решаемо
чисто на скрипте писать не было времени
содержимое буфера обмена контролируй сам
Изображение    Изображение    Изображение
Аватара пользователя
LocKtaR-o-DarK
Сообщения: 349
Зарегистрирован: Пт авг 12, 2005 04:20
Откуда: Москва
Контактная информация:

Сообщение LocKtaR-o-DarK »

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

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

команда for ... do ren ... (и прямо на кнопке, и в скрипте вызываемом с кнопки) дает это:

Access violation at address 00407275. Read of address 00000000.
Please report this error to the Author,
with a description of what you were doing when this error occured!
Continue execution?

После нажатия ОК файлы переименовываются и ТС работает как буд-то так и надо.
ТС 7.03, WinXP SP2

P.S. скрытые файлы не должны переименовываться?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Tol!k писал(а):команда for ... do ren ... (и прямо на кнопке, и в скрипте вызываемом с кнопки) дает это:

Access violation at address 00407275. Read of address 00000000.
Вряд ли такая ошибка выдается на команды ДОС. Скорее всего (у меня так было) глючит надстройка на оболочку.
У тебя в свойствах папок\файлов (Alt+Enter) дополнительных (не дефолтных) закладок нет?

LocKtaR-o-DarK
Мне кажется, что использовать одновременно и vbs, и batch не очень красиво. Перепиши чтение списка файлов на vbs через

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

For Each F In Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0), 1).ReadAll, vbNewLine)
Tol!k
Предлагаю еще один способ решения задачи.
Для этого понадобятся Script Helper и Script Content Plugin.
Для Script Content Plugin добавляем в скрипте возрат еще одной колонки (например, Result1):

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

'============================
' Колонка Result1 будет возвращать текстовое содержимое буфера обмена
'============================
content1 = Result1
Function Result1
  On Error Resume Next
  Result1 = CreateObject("TCScript.Helper").GetTextFromClip
  If Err.Number <> 0 Then
    Result1 = ""
  End If
  On Error GoTo 0
End Function
Соответственно, теперь в TC выделяешь файлы\папки, выполняешь команду группового переименования (Ctrl+M) и в поле "Маска для имени файла" по своему усмотрению используешь тэг "[=script.Result1]".
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
LocKtaR-o-DarK
Сообщения: 349
Зарегистрирован: Пт авг 12, 2005 04:20
Откуда: Москва
Контактная информация:

Сообщение LocKtaR-o-DarK »

Tol!k
для того, чтобы отследить ошибку, надо переписывать команду (сценарий, скрипт) так, чтобы он(а) писала в файл отчёта или выводить ошибки команд в консоль
это называется отладкой и попахивает геммороем
возможно у тебя файлы заняты каким-то процессом
используй unlocker для определения этого варианта
как работает вариант скрипт+сценарий?
Batya
согласен, что не очень красиво, но, все-таки, довольно просто и работоспособно
а дальше?
твой код читает список файлов, в конце которого пустая строка
как в этом случае поведёт себя команда переименования (перемещения) надо тестировать
поэтому надо делать проверку на пустую строку или переписывать код
опять же для вставки маски переименования надо вызывать туеву хучу объектов или юзать regexp
мне лично это немного впадлу
но если напишешь, буду только рад
Изображение    Изображение    Изображение
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

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

LocKtaR-o-DarK, ошибку взывает именно "for ... do rename ...".
"for ... do echo ..." или "for ... do type ..." ошибку не взывает.
Что за вариант скрипт+сценарий?
Последним пробовал обновленный http://darqus.org/p/forum/forum_viewtop ... 0#post_198.
Если http://darqus.org/p/forum/forum_viewtop ... 0#post_197, то те-же зайцы.
Аватара пользователя
LocKtaR-o-DarK
Сообщения: 349
Зарегистрирован: Пт авг 12, 2005 04:20
Откуда: Москва
Контактная информация:

Сообщение LocKtaR-o-DarK »

Tol!k
1. проверь название vbs-файла
оно не должно совпадать с названиями команд
так, возможна ошибка при работе кода если файл будет называться ren или rename или еще как-то
для сценариев и скриптов необходимо задавать уникальные имена, не совпадающие с командами


скрипт
Код:
' В качестве команды указываем путь к скрипту
' допускаетcя использование %commander_path%
' Параметры кнопки: %L
' Автор: LocKtaR-o-DarK™
If WScript.Arguments.Count=0 Then
MsgBox
"Не заданы параметры!",,"Переименование файлов по маске из буфера"
WScript.Quit
End If
CreateObject
(
"WScript.Shell").Run "c:\renbm.cmd "&WScript.Arguments(0)&" """&CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")&"" ,0

c:\renbm.cmd замени на свой путь, допускается использование %commander_path%

сценарий
Код:
@echo off
chcp 1251>nul
for
/f "delims=" %%a in (%1) do ren "%%a" """"%2_%%~nxa""""

еще один момент, путь запуска у кнопки должен быть пустым
Изображение    Изображение    Изображение
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

LocKtaR-o-DarK
Ну, как говорится, "Хозяин - барин".
Я, правда, не понял о каких масках файлов ты говоришь.

... Вообщем написал vbs-скрипт.
В скрипте используется Script Helper.

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

'======================================================================
' Переименование выделенных файлов\папок - 
'   Добавление в начало имени текста из буфера обмена

' Параметры вызова из TC:
' %L
'======================================================================

Option Explicit
Dim CharArr, RemStrArr
'=== Изменяемые параметры =============================================
'Массив недопустимых символов. Заменяем их указанным ниже символом
CharArr = Array(Chr(10), Chr(13), "\", "/")
'Символ для замены
Const ReplaceChar = " "
'Переходный символ
Const TransChar = "_"
'Массив удаляемых строк
RemStrArr = Array("Спёрто с http://www.site.com/", _
                  "пишем, что хотим удалить", _
                  "пишем, что также хотим удалить")
'======================================================================

Dim Mess, FSO, FileList, TCS, Clip, Char, F, FF

SetMess
Set FSO = CreateObject("Scripting.FileSystemObject")
CheckParam
For Each F In Split(FSO.OpenTextFile(FileList, 1, False).ReadAll, vbNewLine)
  F = Trim(F)
  If F <> "" Then
    If FSO.FileExists(F) Then
      Set FF = FSO.GetFile(F)
    End If
    If FSO.FileExists(F) Then
      Set FF = FSO.GetFile(F)
    End If
    If FSO.FolderExists(F) Then
      Set FF = FSO.GetFolder(F)
    End If
    FF.Name = Clip & TransChar & FF.Name
  End If
  Set FF = Nothing
Next

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
  On Error Resume Next
  Set TCS = CreateObject("TCScript.Helper")
  If Err.Number > 0 Then
    MessBox Mess(3), 1
    Quit
  End If
  On Error GoTo 0
  Clip = TCS.GetTextFromClip
  If Clip = "" Then
    MessBox Mess(4), 1
    Quit
  End If
  For Each Char In RemStrArr
    Clip = Replace(Clip, Char, "")
  Next
  For Each Char In CharArr
    Clip = Replace(Clip, Char, ReplaceChar)
  Next
  Clip = Trim(Clip)
End Sub

Sub SetMess
  Set Mess = CreateObject("Scripting.Dictionary")
  Mess.Add 0,  "Переименование"
  Mess.Add 1,  "Неправильно указаны параметры!"
  Mess.Add 2,  "Входной параметр не является файлом!"
  Mess.Add 3,  "Не зарегистрирован объект 'Script Helper ActiveX for Total Commander'!"
  Mess.Add 4,  "Буфер обмена не содержит текста!"
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

Sub Quit
  Set TCS = Nothing
  Set FSO = Nothing
  Wscript.Quit
End Sub
Последний раз редактировалось Batya Пн янв 12, 2009 12:12, всего редактировалось 1 раз.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Заработало

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

LocKtaR-o-DarK, Batya, обновился до ТК 7.04 - Access violation исчез
:пиво: :баян: :гопак:
Всем спасибо!

ЗЫ
кажется, ТК раньше времени удалял свои временные файлы, а потом их не находил.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

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

Batya
В скрипте можно заменять отдельные символы

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

'Массив недопустимых символов. Заменяем их указанным ниже символом 
CharArr = Array(Chr(10), Chr(13), "\", "/") 
'Символ для замены 
Const ReplaceChar = "_"
Нельзя ли сделать замену подстроки типа "Спёрто с http://www.site.com/" на ничего или хотя-бы на тот же ReplaceChar?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Tol!k писал(а):Нельзя ли сделать замену подстроки ... на тот же ReplaceChar?
Это хоть сейчас:

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

'Массив недопустимых символов. Заменяем их указанным ниже символом 
CharArr = Array(Chr(10), Chr(13), "", "/", "Спёрто с http://www.site.com/")
Если нужно, могу дополнить скрипт массивом удаляемых строк (символов).
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

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

Batya писал(а):Это хоть сейчас
:oops:
Batya писал(а):Если нужно, могу дополнить скрипт массивом удаляемых строк (символов).
Да, было бы здОрово.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Tol!k писал(а):Да, было бы здОрово.
Готово.
См. исходный скрипт.

На имена переменных (например, "Char") можно внимание не обращать :)
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

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

Batya, спасибо.
Ответить