Страница 2 из 3

Добавлено: Пн июн 23, 2008 20:40
Tol!k
Гм. Все супер. Только в ТЗ было:
Tol!k писал(а): в буфере обмена: приставка;
.
Ключевое слово - в БУФЕРЕ обмена.

Добавлено: Ср июн 25, 2008 18:27
LocKtaR-o-DarK
Tol!k
ну что же, решаемо
чисто на скрипте писать не было времени
содержимое буфера обмена контролируй сам

Добавлено: Ср июл 02, 2008 13:02
LocKtaR-o-DarK
обновил скрипт, ссылка та же

Добавлено: Вс июл 13, 2008 18:07
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. скрытые файлы не должны переименовываться?

Добавлено: Пн июл 14, 2008 11:00
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]".

Добавлено: Чт июл 24, 2008 15:51
LocKtaR-o-DarK
Tol!k
для того, чтобы отследить ошибку, надо переписывать команду (сценарий, скрипт) так, чтобы он(а) писала в файл отчёта или выводить ошибки команд в консоль
это называется отладкой и попахивает геммороем
возможно у тебя файлы заняты каким-то процессом
используй unlocker для определения этого варианта
как работает вариант скрипт+сценарий?
Batya
согласен, что не очень красиво, но, все-таки, довольно просто и работоспособно
а дальше?
твой код читает список файлов, в конце которого пустая строка
как в этом случае поведёт себя команда переименования (перемещения) надо тестировать
поэтому надо делать проверку на пустую строку или переписывать код
опять же для вставки маски переименования надо вызывать туеву хучу объектов или юзать regexp
мне лично это немного впадлу
но если напишешь, буду только рад

Добавлено: Чт июл 24, 2008 16:46
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, то те-же зайцы.

Добавлено: Пт июл 25, 2008 16:00
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""""

еще один момент, путь запуска у кнопки должен быть пустым

Добавлено: Пн июл 28, 2008 14:48
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

Заработало

Добавлено: Пт авг 01, 2008 11:38
Tol!k
LocKtaR-o-DarK, Batya, обновился до ТК 7.04 - Access violation исчез
:пиво: :баян: :гопак:
Всем спасибо!

ЗЫ
кажется, ТК раньше времени удалял свои временные файлы, а потом их не находил.

Добавлено: Сб янв 10, 2009 20:01
Tol!k
Batya
В скрипте можно заменять отдельные символы

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

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

Добавлено: Вс янв 11, 2009 11:05
Batya
Tol!k писал(а):Нельзя ли сделать замену подстроки ... на тот же ReplaceChar?
Это хоть сейчас:

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

'Массив недопустимых символов. Заменяем их указанным ниже символом 
CharArr = Array(Chr(10), Chr(13), "", "/", "Спёрто с http://www.site.com/")
Если нужно, могу дополнить скрипт массивом удаляемых строк (символов).

Добавлено: Вс янв 11, 2009 18:49
Tol!k
Batya писал(а):Это хоть сейчас
:oops:
Batya писал(а):Если нужно, могу дополнить скрипт массивом удаляемых строк (символов).
Да, было бы здОрово.

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

На имена переменных (например, "Char") можно внимание не обращать :)

Добавлено: Пн янв 12, 2009 21:28
Tol!k
Batya, спасибо.