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

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

Добавлено: Ср апр 25, 2018 00:22
Dimsok
Имеется скрипт (и самостоятельная кнопка) для переименования выделенного файла из буфера. Хотелось бы иметь средство, позволяющее переименовывать все выделенные файлы из буфера вида, в который они заносятся туда по команде "выделение/копировать имена файлов в буфер".

Добавлено: Ср апр 25, 2018 01:31
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

Добавлено: Ср апр 25, 2018 03:58
Dimsok
Спасибо, так годится. Что исправить для варианта, чтобы не менять расширение?
И ещё бы добавить возможность переименовывания папок.

Добавлено: Ср апр 25, 2018 04:49
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

Добавлено: Ср апр 25, 2018 07:36
Avada
Заголовок темы приведён в более адекватный содержанию вид.

Добавлено: Пт апр 27, 2018 16:49
ZZZAlexZZZ
Flasher
Для данного скрипта вылезает ошибка:

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

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

Добавлено: Пт апр 27, 2018 20:45
Flasher
ZZZAlexZZZ
Не думал, что кто-то сюда ещё нагрянет (запрос специфический). :) TCx64? У Dimsok XPx32. Переноска wscript.exe для TCHelper найдётся в наличии? Если да, то случай подходящий. Если нет, то путь спереди можно брать такой: %SystemRoot%\SysWOW64\wscript.exe. Также для обоюдного случая можно запилить переменную в Autorun.

Добавлено: Сб апр 28, 2018 08:50
ZZZAlexZZZ
Flasher
Спасибо, периодически приходится делать нечто подобное, поэтому работа с буфером в vbs без утилит очень интересует.
Что касается битности - верно, TC64, система тоже.
Вариант с %SystemRoot%\SysWOW64\wscript.exe подходит больше, т.к. если до конца описывать, то работа через терминалку на сервере, куда ничего и не поставить и не скопировать.

Добавлено: Сб апр 28, 2018 10:00
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

Добавлено: Сб апр 28, 2018 10:38
ZZZAlexZZZ
Flasher
Т.е. "не скопировать"? В подпапку ТС нельзя скопировать wscript.exe?
TCHelper нельзя на терминальную машину скопировать, неоткуда взять.

Добавлено: Сб апр 28, 2018 10:42
Flasher
ZZZAlexZZZ
А где в цитате TCHelper? :)
TC находится на терминальной машине? Т.е. не переноска?

Добавлено: Сб апр 28, 2018 10:55
ZZZAlexZZZ
Flasher
А где в цитате TCHelper?
Сюда смотрел, на это ориентировался как на вариант решения.
У Dimsok XPx32. Переноска wscript.exe для TCHelper найдётся в наличии?
Да и не в нем конкретно дело, никиких утилит не добавить, "голая" винда :D
TC находится на терминальной машине? Т.е. не переноска?
Да, админ как поставил. Могу только скрипты набивать)

Добавлено: Сб апр 28, 2018 11:03
Flasher
ZZZAlexZZZ
Какая-то странная история. Скрипты плодить можно, а утилиты нет. Запрет на запись .exe или что? А библиотеки с плагинами?

Добавлено: Сб апр 28, 2018 11:23
ZZZAlexZZZ
Flasher
Нас за оффтоп не расстреляют)?
Показать
Работаю с сервером через терминал, через который файлы не передашь никак. Total на сервере установлен админом, могу в его папке создавать текстовые документы. Плагинов нет и не будет.
Есть возможность просматривать pdf, exl, doc ну и т.п офисные, почты нет. Так понятно?

Добавлено: Сб апр 28, 2018 11:59
Flasher
ZZZAlexZZZ
Ответ на косвенный вопрос может иначе разрешить проблему. В его папке физический (не условный) запрет на создание файлов с определёнными расширениями? Так?