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

Скрипт меняющий имена двух объектов местами

Добавлено: Чт окт 16, 2014 13:48
helb
Часто возникает необходимость поменять местами имена пары файлов/папок. Автоматизировал, сведя до одного нажатия на клавиатуре (у меня Ctrl+Shift+F11). Переименовывает либо ровно два выделенных объекта в текущей панели, либо то что под курсором в обеих.
Параметры: <имя1> <имя2> /<альтернативное имя>
Параметры в TC: %P%S /%T%M %L (последний опционален, для обновления списка в TC)

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

'==========================================================
' Swap names (by helb)
' Swaps two filenames, if only <file1> specified (in case of generated list) uses alternative
' Parameters: <file1> <file2> [/<alternative filename>]
' Total Commander parameters: %P%S /%T%M [%L] (two selected in current panel or under cursor in both panels, %L to refresh)
'Переименовывает либо ровно два выделенных объекта в текущей панели, либо то что под курсором в обеих.
'Параметры: <имя1> <имя2> /<альтернативное имя>
'Параметры в TC: %P%S /%T%M %L (последний опционален, для обновления списка в TC)
'==========================================================
unq1 = "swap1-e78d4204-b110-42b6-882e-c93cbab51cd7"
unq2 = "swap2-f8ea00d3-9b76-4039-89c6-8feab352c079"

with WScript.Arguments
	if .length < 2 then
		WScript.Echo("Insufficient parameters")
		WScript.Quit
	end if
	orig1 = .Item(0)
	if .length >= 3 and Left(.Item(1), 1) <> "/" and Left(.Item(2), 1) <> "/" or Left(.Item(0), 1) = "/" then
		WScript.Echo("More than two files specified")
		WScript.Quit
	else
		orig2 = .Item(1)
	end if
end with

set FSO = CreateObject("Scripting.FileSystemObject")

if Left(orig2, 1) = "/" then orig2 = Right(orig2, Len(orig2)-1)
if objExists(orig1) = 0 or objExists(orig2) = 0 then
	WScript.Echo("File not found")
	WScript.Quit
end if

set f1 = getObj(orig1)
set f2 = getObj(orig2)
orig1 = f1.Name
orig2 = f2.Name

if not renameObj(f1, unq1) then WScript.Quit
if not renameObj(f2, unq2) then
	f1.Name = orig1
	WScript.Quit
end if

f1.Name = orig2
f2.Name = orig1


function renameObj(f, newname)
	renameObj = true
	on error resume next
	f.Name = newname
	if err.Number <> 0 then
		WScript.Echo("Unable to rename: " & f.Name & vbNewLine & "Error #" & CStr(err.Number) & " " & err.Description)
		renameObj = false
		err.clear
	end if
end function

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

Добавлено: Чт фев 19, 2015 03:23
HA3APET
helb
Если в пути к скрипту есть пробел, то он не работает.
Поправьте пожалуйста.

Добавлено: Чт фев 19, 2015 10:18
sa
HA3APET писал(а):не работает.
По-моему, вопрос к тоталу: что-то связанное с неверной обработкой параметра %S при наличии пробела в пути/имени программы.
В чём-то перекликается с
03.06.11 Исправлено: Панель инструментов: Вместо запуска программы в "c:\Program Files" с параметром %S мог запуститься (если существовал) файл c:\Program.exe. (32/64)

Добавлено: Чт фев 19, 2015 13:00
helb
Да, это к Тоталу. Попробуйте команду (полный путь скрипта в кавычках и параметры) напрямую в cmd запустить — работает нормально. Так что держите скрипты в специально отведенном месте без пробелов в пути.

Добавлено: Чт фев 19, 2015 14:49
HA3APET
Кавычки в параметрах не помогают, ч то с ними что без них результат один.
Например, если путь такой c:\totalcmd 63\Scripts\Swap.vbs

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

TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\Scripts\Swap.vbs"
"%P%S" /%T%M %L
C:\Windows\System32\WScript.exe,3
Поменять местами имена двух файлов/папок под курсором


-1
То ошибка такая:
Изображение

То есть спотыкается на пробеле.

Добавлено: Чт фев 19, 2015 15:40
helb
Об этом и речь, кавычки в самом Тотале не спасают. Они всё равно где-то теряются, и он пытается это безобразие выполнить.

Попробовал вариант напрямую скрипт-хост указывать — работает.
Команда: wscript.exe "<полный путь скрипта>"

Добавлено: Чт фев 19, 2015 21:58
HA3APET
helb
Во, супер, так заработало. Спасибо за скрипт.
TOTALCMD#BAR#DATA
wscript.exe "%COMMANDER_PATH%\Scripts\Swap.vbs"
%P%S /%T%M %L
C:\Windows\System32\WScript.exe,3
Поменять местами имена двух файлов/папок под курсором


-1

Добавлено: Вт ноя 19, 2024 22:14
kuzduk
Скрипт работает! БЛАГОДАРЮ!

вот бы доработать такую мелочь как: если выделена папка и файл, то при Swap-переименовании папке присваивается имя файла с расширением файла, а файлу присваивается имя папки и файл становится без расширения, а надо бы чтоб у файла осталось старое расширение, а имя стало как у папки, а папке присвоилось имя файла, но без расширения.

Добавлено: Чт ноя 21, 2024 09:51
Вахмурка