Переименование файлов и папок по списку из буфера обмена

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

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

Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Переименование файлов и папок по списку из буфера обмена

Сообщение Dimsok »

Имеется скрипт (и самостоятельная кнопка) для переименования выделенного файла из буфера. Хотелось бы иметь средство, позволяющее переименовывать все выделенные файлы из буфера вида, в который они заносятся туда по команде "выделение/копировать имена файлов в буфер".
Последний раз редактировалось Dimsok Ср апр 25, 2018 05:02, всего редактировалось 1 раз.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Избыточное описание.
Напрашиваются 2 проблемы:
1. Выделенных файлов 50, а в буфере список из 20. Или наоборот. Что тогда?
2. Имена из буфера полностью или частично уже есть в получателе (в т.ч. среди выделенных). И?

Сделал пока так:
1. Обработка меньшего из чисел в буфере/получателе.
2. Пропускать переименование файла, попавшего под совпадение.

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

'=================================== VBS ===================================
' Переименовать выбранные в активной панели файлы по списку из буфера обмена
' Условие:  путь запуска — пустой
' Параметр: %WF
'===========================================================================
Option Explicit : Dim REx, Clip, Max, i, List, N, nN

If WSH.Arguments.Count = 0 Then WSH.Quit
Set REx = New RegExp : REx.Global = True
REx.Pattern = "^[\r\n]+|[\r\n]+(?=\r?\n)|[\r\n]+$"
With GetObject("New:1C3B4210-F441-11CE-B9EA-00AA006B1A69)")
  .GetFromClipboard : Clip = Split(REx.Replace(.GetText,""),vbLf)
End With : Max = UBound(Clip) : i = 0 : If Max = -1 Then WSH.Quit
With CreateObject("Scripting.FileSystemObject")
  Set List = .OpenTextFile(WSH.Arguments(0),,,-1)
  Do : N = List.ReadLine : nN = Clip(i)
    If .FileExists(N) And Not .FileExists(nN) Then .GetFile(N).Name = nN
    If Max <> i Then i = i + 1 Else Exit Do
  Loop Until List.AtEndOfStream
  List.Close : Set List = Nothing
End With
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

Спасибо, так годится. Что исправить для варианта, чтобы не менять расширение?
И ещё бы добавить возможность переименовывания папок.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Для папок заголовок топика надо править.
С добавками:

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

'======================== VBS ========================
' Переименовать выбранные объекты в активном каталоге
' по списку имён из буфера обмена или текстового файла

' Условия: путь запуска — пустой;
'          кодировка списка для ключа /list: UTF-16 LE

' Параметры: %WF "%P"

' Ключи:  /base — переименовывать только базовые имена
'  /list:"<Путь к списку>" — файл вместо буфера обмена
'=====================================================
Option Explicit
Dim A, List, REx, FSO, Base, Ext, Clip, Max, i, N, nN

Set A = WSH.Arguments
List = A.Named("list")
If A.Count = 0 Then WSH.Quit
Base = A.Named.Exists("base")
Set REx = New RegExp : REx.Global = True
REx.Pattern = "^[\r\n]+|[\\\s]+(?=\r?\n|$)"
Set FSO = CreateObject("Scripting.FileSystemObject")
If Len(List) Then
  Clip = Split(REx.Replace(FSO.OpenTextFile(CreateObject(_
  "WScript.Shell").ExpandEnvironmentStrings(List),,,-1).ReadAll, ""), vbLf)
Else
  With GetObject("New:1C3B4210-F441-11CE-B9EA-00AA006B1A69)")
    .GetFromClipboard : Clip = Split(REx.Replace(.GetText,""), vbLf)
  End With
End If : Max = UBound(Clip) : i = 0 : If Max = -1 Then WSH.Quit
With FSO
  If Not .FolderExists(A(1)) Then WSH.Quit
  Set List = .OpenTextFile(A(0),,,-1)
  Do : N = List.ReadLine
    If Base Then
      Ext = .GetExtensionName(N)
      If Len(Ext) Then Ext = "." & Ext
      nN = .GetBaseName(Clip(i)) & Ext
    Else nN = Clip(i) End If
    If Not (.FileExists(nN) Or .FolderExists(nN)) Then _
    If .FileExists(N) Then .GetFile(N).Name = nN Else .GetFolder(N).Name = nN
    If Max <> i Then i = i + 1 Else Exit Do
  Loop Until List.AtEndOfStream
  List.Close : Set List = Nothing
End With
Последний раз редактировалось Flasher Ср май 02, 2018 02:46, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10544
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Заголовок темы приведён в более адекватный содержанию вид.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
ZZZAlexZZZ
Сообщения: 68
Зарегистрирован: Сб мар 08, 2014 22:25

Сообщение ZZZAlexZZZ »

Flasher
Для данного скрипта вылезает ошибка:

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

Сценарий:	D:\Cl.vbs
Строка:	11
Символ:	1
Ошибка:	Невозможно создание объекта контейнером ActiveX: 'GetObject'
Код:	800A01AD
Источник: 	Ошибка выполнения Microsoft VBScript
В чем может проблема, куда копать(путь запуска пустой)?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ZZZAlexZZZ
Не думал, что кто-то сюда ещё нагрянет (запрос специфический). :) TCx64? У Dimsok XPx32. Переноска wscript.exe для TCHelper найдётся в наличии? Если да, то случай подходящий. Если нет, то путь спереди можно брать такой: %SystemRoot%\SysWOW64\wscript.exe. Также для обоюдного случая можно запилить переменную в Autorun.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
ZZZAlexZZZ
Сообщения: 68
Зарегистрирован: Сб мар 08, 2014 22:25

Сообщение ZZZAlexZZZ »

Flasher
Спасибо, периодически приходится делать нечто подобное, поэтому работа с буфером в vbs без утилит очень интересует.
Что касается битности - верно, TC64, система тоже.
Вариант с %SystemRoot%\SysWOW64\wscript.exe подходит больше, т.к. если до конца описывать, то работа через терминалку на сервере, куда ничего и не поставить и не скопировать.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ZZZAlexZZZ писал(а):поэтому работа с буфером в vbs без утилит очень интересует.
Да тут, в общем-то, большинство примеров и так без утилит.
ZZZAlexZZZ писал(а):система тоже.
Система вторична. Значение имеет битность родительского процесса.
ZZZAlexZZZ писал(а):работа через терминалку на сервере, куда ничего и не поставить и не скопировать.
Т.е. "не скопировать"? В подпапку ТС нельзя скопировать wscript.exe? :shock:
И как уже намекнул, с переменной %wscript% было бы универсальней:
autorun.cfg писал(а):If %SYSINFO_OSARCH% = 32 Then
SetEnv wscript %SystemRoot%\System32\wscript.exe
Else
SetEnv wscript %SystemRoot%\SysWOW64\wscript.exe
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
ZZZAlexZZZ
Сообщения: 68
Зарегистрирован: Сб мар 08, 2014 22:25

Сообщение ZZZAlexZZZ »

Flasher
Т.е. "не скопировать"? В подпапку ТС нельзя скопировать wscript.exe?
TCHelper нельзя на терминальную машину скопировать, неоткуда взять.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ZZZAlexZZZ
А где в цитате TCHelper? :)
TC находится на терминальной машине? Т.е. не переноска?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
ZZZAlexZZZ
Сообщения: 68
Зарегистрирован: Сб мар 08, 2014 22:25

Сообщение ZZZAlexZZZ »

Flasher
А где в цитате TCHelper?
Сюда смотрел, на это ориентировался как на вариант решения.
У Dimsok XPx32. Переноска wscript.exe для TCHelper найдётся в наличии?
Да и не в нем конкретно дело, никиких утилит не добавить, "голая" винда :D
TC находится на терминальной машине? Т.е. не переноска?
Да, админ как поставил. Могу только скрипты набивать)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ZZZAlexZZZ
Какая-то странная история. Скрипты плодить можно, а утилиты нет. Запрет на запись .exe или что? А библиотеки с плагинами?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
ZZZAlexZZZ
Сообщения: 68
Зарегистрирован: Сб мар 08, 2014 22:25

Сообщение ZZZAlexZZZ »

Flasher
Нас за оффтоп не расстреляют)?
Показать
Работаю с сервером через терминал, через который файлы не передашь никак. Total на сервере установлен админом, могу в его папке создавать текстовые документы. Плагинов нет и не будет.
Есть возможность просматривать pdf, exl, doc ну и т.п офисные, почты нет. Так понятно?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ZZZAlexZZZ
Ответ на косвенный вопрос может иначе разрешить проблему. В его папке физический (не условный) запрет на создание файлов с определёнными расширениями? Так?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить