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

Вызов диалога переименования для единичного файла

Добавлено: Вс фев 21, 2010 11:20
Avada
Проблема возникла как логическое продолжение вот этого моего поста. Пусть в неком каталоге есть отображаемый элемент [..] и, среди прочего, единичный файл или подкаталог, который мы хотим переименовать не в панели, как обычно, а в диалоге, в норме предназначенном для пакетного переименования. Именно в нём, а не в вызываемом по F6 общем диалоге переименования/перемещения!
Хотелось бы, имея под курсором объект, подлежащий переименованию, выполнять VBS-скриптом следующую цепочку действий:
• выделение объекта под курсором;
• выделение элемента [..];
• возврат курсора на исходный объект;
• вызов команды cm_RenameOnly для этой пары.
Результатом должно стать открытие диалога пакетного переименования для объекта под курсором.

И если скрипт случайно запущен в корневом каталоге, где не включено отображение [..], можно ли сделать так, чтобы просто сообщалось, что операция здесь неприменима?

Добавлено: Вс фев 21, 2010 18:29
sa
Вот что получилось на скорую руку:

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

'  Description:  Вызов диалога пакетного переименования для файла под курсором 
'  Parameters:   %N
'  Requirements: WSH Helper for TC by Volniy
'  Installation: Создайте для скрипта, например, кнопку на панели инструментов TC
'  Autor:        sa
Option Explicit
If WScript.Arguments.Count < 1 Then
  MsgBox "Курсор не должен располагаться на строке ""..""", _ 
   vbOKOnly + vbCritical,  "Вызов диалога пакетного переименования"
  WScript.Quit
End If
Dim TCS, P_N
Set TCS = CreateObject("TCScript.Helper")
TCS.LockTC True
TCS.SendCommand 524  'cm_ClearAll
P_N = TCS.GetSrcSelectedFiles(True)(0)
If InStrRev(P_N,"\") = Len(P_N) Then 
  P_N = Left(P_N,len(P_N)-1)
End If
P_N = Right(P_N,Len(P_N)-InStr(1,P_N,"\"))
If (TCS.INIRead(TCS.MainINI, "Configuration", "ShowParentDirInRoot", 0) = 1) Or _ 
           Instr(1,P_N,"\") > 0 Then
  TCS.SendKeystroke "{INSERT}{HOME}{INSERT}"
  TCS.SendCommand 2053 'cm_GotoNextSelected
  TCS.SendCommand 1002 'cm_RenameOnly
Else
  MsgBox "Нет "".."" в корневом каталоге диска! Диалог неприменим.", _
   vbOKOnly + vbSystemModal,  "Вызов диалога пакетного переименования"
End If
TCS.LockTC False 
Set TCS = Nothing
Wscript.Quit

Добавлено: Вс фев 21, 2010 20:53
Avada
sa
Спасибо, но скрипт работать пока не хочет. При вызове кнопкой отображается сообщение "Курсор не должен располагаться..." и т.д. Курсор, естественно, там не располагается. Жму OK, ничего не происходит.
Кроме того, ИМХО, основная цепочка действий мне представлялась проще. Привожу просто в столбик:
cm_ClearAll
{INSERT}
{HOME}
{INSERT}
cm_GotoNextSelected
cm_RenameOnly
Или я что-то недопонял? И зачем cm_RereadSource? И как выясняется, что в корне нет [..]?

Добавлено: Вс фев 21, 2010 20:58
sa
Avada
В качестве параметра %N точно указан?

Добавлено: Вс фев 21, 2010 21:25
Avada
sa
Разумеется, забыл. :wink:
После добавления параметра при запуске имеем следующее:

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

---------------------------
Сервер сценариев Windows
---------------------------
Сценарий:	C:\Totalcmd\Utils\Scripts\SingleRenamer.vbs
Строка:	13
Символ:	1
Ошибка:	Не удается найти указанный файл.

Код:	80070002
Источник: 	(null)

---------------------------
ОК   
---------------------------
На кнопке путь запуска пустой.

Добавлено: Вс фев 21, 2010 21:37
sa
Avada
Скорее всего не установлен "Requirements: WSH Helper for TC by Volniy"

Добавлено: Вс фев 21, 2010 22:20
Avada
sa
Да нет, он установлен, но регистрация каким-то образом совсем недавно слетела, там все скрипты перестали работать. Восстановил.
Что ж, смотрим. В подкаталоге, где есть [..] (в том числе и в корневом), если опция включена, скрипт работает, спасибо. (Теперь я понял, зачем нужно перечитывание панели.)
А вот ситуация, когда у нас корень, но [..] в нём нет, обрабатывается не вполне корректно. Имеем предупреждение, что [..] нет в корневом каталоге. Хорошо, правильно. Что я должен ожидать, нажимая OK? Возврата в корень к исходному состоянию. Вместо этого я постоянно оказываюсь в виртуальной папке Корзина! Хорошо бы это как-то поправить.
И второй нюансик. Если в вызванном диалоге переименования я нажму OK, всё нормально. При нажатии же кнопки Отмена, диалог закрывается, но фильтрация по выделению автоматически не снимается. Можно с этим что-то сделать?

Добавлено: Вс фев 21, 2010 23:10
sa
Avada писал(а):Вместо этого я постоянно оказываюсь в виртуальной папке Корзина!
У меня работает нормально. Комбинация клавиш Ctrl+R случайно не переназначена? Что происходит, если строку

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

TCS.SendKeystroke "^R"     'cm_RereadSource
закомментировать?
Avada писал(а):фильтрация по выделению автоматически не снимается. Можно с этим что-то сделать?
В данном варианте скрипта нет.
Возможно удастся обойти эту ситуацию в варианте с cm_GotoNextSelected. Но это уже завтра...

Добавлено: Вс фев 21, 2010 23:31
Avada
sa
Если закомментировать или вообще убрать, перехода в Корзину нет. Ctrl+R не переназначено. Но комбинация для перехода в Корзину у меня Ctrl+Shift+R. Похоже, в этом-то и причина. Пока поменял в скрипте на F2, которая у меня тоже в натуральном виде. Работает.
А что можно сделать с Ctrl+R? И зачем вообще нужна клавиша при наличии команды обновления как таковой?

Добавлено: Вс фев 21, 2010 23:54
sa
Переделал скрипт с использованием команды cm_GotoNextSelected. Скорректировал определение корневого диска без "..".

Добавлено: Пн фев 22, 2010 09:32
Avada
sa
Отлично. Единственная оставшаяся просьба: можно ли сделать предупреждающий диалог при вызове скрипта в корне без [..] по образу и подобию диалога, отображаемого при курсоре на [..]? То есть с таким же значком, расположенным не в заголовке?

Добавлено: Пн фев 22, 2010 09:46
sa
Avada писал(а):можно ли сделать предупреждающий диалог
Для этого достаточно поменять в последнем MsgBox vbSystemModal на vbCritical.

Добавлено: Пн фев 22, 2010 09:59
Avada
sa
Сделал. Что ж, спасибо за оперативность и качество работы!