Script Request

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

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

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

WindR
Речь про работу скрипта, а не самостоятельный жимоклик. Так?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
WindR
Сообщения: 35
Зарегистрирован: Сб дек 21, 2019 13:38

Сообщение WindR »

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

Сообщение Flasher »

WindR
Мда. Думал, это только у меня косячит. Посмотрю, как оно с нажатием кнопки будет. Но без TCFS2 тут уже, увы, не обойтись.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

По запросу:

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

'============================= VBS =============================
' Выделение всех объектов между двумя выделенными (включительно)
' Условие: необходим компонент TCScript.dll 1.0.0.14+
' Параметры: %S [/p:<ms>]
' Ключ /p:<ms> задаёт задержку в миллисекундах (40 по умолчанию)
'========================================== Автор: Flasher © ===
Option Explicit : Dim A, TCH, M, Check : Set A = WSH.Arguments
Set TCH = CreateObject("TCScript.Helper")
If A.UnNamed.Count <> 2 Then Quit "Выберите 2 объекта!"
M = A.Named("p") : If IsEmpty(M) Then M = 40
With TCH
  .Pause = 0 : .LockTC True : Cm(2049)(2056)
  Check = StrComp(A(0), .GetInfo("SN"), 1) <> 0
  If Check Then Cm(2053) End If : Cm(544)
  If Check Then Cm(2056) : .SendKeyStroke "+^{HOME}" : .Sleep M
  Cm(2057) : Check = StrComp(A(1), .GetInfo("SN"), 1)
  If Check = 0 Then Cm(544) Else Cm(2054)(2937) : .SendKeyStroke "+{End}" : .Sleep M
  Cm(525) : If Check <> 0 Then Cm(2054) End If  : .LockTC False
End With: Set TCH = Nothing
Function Cm(n) TCH.SendCommand n, 1 : Set Cm = GetRef("Cm") End Function

Sub Quit(Msg)
  With TCH
    Dim Color : .LockTC False
    Color = .INIRead(.MainINI, "Colors", "BackColor", "16777215")
    If Color = "-1" Then Color = 16777215
    CreateObject("Internet.HHCtrl").TextPopup Msg,_
    .INIRead(.MainINI, "AllResolutions", "FontNameTip", "Verdana") &","&_
    .INIRead(.MainINI, "AllResolutions", "FontSizeTip", "10"), 20, 10,_
    Abs(.INIRead(.MainINI,"Colors","ForeColor","-1")), Color
    WSH.Sleep 2000 : Set TCH = Nothing : WSH.Quit
  End With
End Sub
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
kirimbay
Сообщения: 18
Зарегистрирован: Ср июл 15, 2020 12:00

Сообщение kirimbay »

Не могу победить, жесть какая-то
https://yadi.sk/i/bwzhiNW-CkogkA
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

kirimbay
Снизу памятки чётко расписано, в какой форме должно быть обращение при проблемах, в т. ч. как вставлять информацию из подобных окон. Вы до сих пор её так и не прочли?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Abrupt
Сообщения: 4
Зарегистрирован: Вт апр 20, 2021 21:52

Сообщение Abrupt »

Помогите со скриптом, плиз.
Нужно переместить все файлы из активной панели в соседнюю и открыть все перемещенные файлы программой, которой они открываются по умолчанию.
Аватара пользователя
Zmy
Сообщения: 78
Зарегистрирован: Пн апр 06, 2015 12:52

Сообщение Zmy »

Abrupt, я написал бы, но для этого надо подробно описывать задачу зараннее.
Чтобы не возникало никаких вопросов.
Типа, что делать, если файл с таким именем уже существует в целевой директории.
Или ожидать ли окончания работы предыдущего файла. И вид окна неясен.
Abrupt
Сообщения: 4
Зарегистрирован: Вт апр 20, 2021 21:52

Сообщение Abrupt »

Zmy
Спасибо за отклик! Не знал, что столько нюансов)
Если файл существует, то переписывать поверх без вопросов.
Открывать все файлы сразу, не меняя вид окна (предполагается, что все используемые приложения уже запущены).
Аватара пользователя
Zmy
Сообщения: 78
Зарегистрирован: Пн апр 06, 2015 12:52

Сообщение Zmy »

Простым скриптом таких результатов не достичь. Чтобы окна не менялись или изменялись.
Ведь каждая программа сама определяет, сколько экземпляров она может работать. И как она сама себя ведёт.
Со сложными программами, там ещё сложнее. Типа Microsoft Office. Там уже идут системные вызовы DDE.
Короче, тут много ньюансов. Тут надо писать мощную программу, которая будет собирать всю требуемую ей статистику.
Написал я небольшой скрипт. На языке Jscript. Я не знаю, как он будет работать на операционных системах новее, чем семёрка.
Короче в заголовке скрипта есть небольшое описание.
Главное - правильно написать параметры.

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

// Команда:
// "C:\Folder\MoveToOther.js"
// Параметр:
// 17 "%T" "%P%S"

// Кавычки обязательны.
 
//  Skip      == 0
//  Count     == 1
//  Rewrite   == 2
   
//  Wait      == 4
   
//  View      == 8    Normal
//  View      == 16   Turned
//  View      == 32   Maximaze

// В начале первый аргумент равен нулю. 
// Складываем флаги, чтобы получилось одно число. По группам. Пример: 
// Я хочу, чтобы при существованиии такого же файла в целевой директории включился счётчик
// (к первому аргументу прибавляю 1), // или хочу перезаписать существующий файл (прибавляю 2).
// В противном случае, ничего не произойдёт.
// 
// Дальше. Я хочу, чтобы файлы запустились одновременно. Я к предыдущему итогу должен прибавить 4.
// Дальше. Я хочу окно в нормальном виде (прибавляю 8), или я хочу видеть в свёрнутом (прибавляю 16),
// или в максимальном виде (прибавляю 32).
// 
// В итоге, получаю сумму флагов. Например 17. Что значит, окно в свёрнутом виде, и прибавляется счётчик,
// при совпадении имён. 

// И первому аргументу присваиваю этот итог.    


function funcion(){var g=WScript.Arguments.length;if (g<3){WScript.Echo
('Wrong Parameteres.   \n\nExample: \n\n\n\nCommand:'+'     \n\n"C:\\Kemp\\MoveAndRun.js"\n\n\nArguments:\n\n17 "%T" "%P%S"');
WScript.Quit();};var z=WScript.Arguments(1),b=parseInt(WScript.Arguments(0),10),
k=new ActiveXObject("Scripting.FileSystemObject"),u=new ActiveXObject("WScript.Shell");if
(z.substr(z.length-1,z.length)=='\\'){z=z.substr(0,z.length-1);};z+="\\";if (!k.FolderExists(z)){
WScript.Echo('Target Folder not Exist.  \n\n\n'+z+" \n");k=u=0;WScript.Quit();};var i=2,n=w=r=t="",q=h=0;for(;i<g;i++)
{n=WScript.Arguments(i);q=n.lastIndexOf("\\");w=n.charAt(q);r=n.substr(parseInt(q,10)+1);h=r.lastIndexOf(".")+1;t=
r.substr(h);w=r.substr(0,parseInt(h,10)-1);h=n.substr(0,parseInt(q,10)+1);if (z.toLowerCase()==h.toLowerCase())
{WScript.Echo("Source and Target Folders Identical. \n\n\n"+h+"\n\n"+z+" \n");break;};q=1;h=z+r;if
(k.FileExists(h)){if (b&0x1){while(k.FileExists(h)){q+=1;h=z+w+"_"+q+"."+t;};}else if
(b&0x2){w=k.GetFile(h);if(w.attributes&1){w.attributes=0;WScript.Sleep(100);};k.DeleteFile(h);}else{continue;};};if
(!k.FileExists(n)){continue;};k.MoveFile(n,h);WScript.Sleep(500);t=(b&0x04)?true:false;if(b&0x10)
{w=2;}else if(b&0x20){w=3;}else{w=1;};u.Run(h,w,t);WScript.Sleep(100);};k=u=0;WScript.Quit();};funcion()

Сохраняете это текст куда-нибудь. Даёте имя, например MoveToOther.js. И расширение должно быть JS.
Создаёте пользовательскую команду в usercmd.ini, в панели инструментов или в меню Старт.
Если появятся какие-нибудь ошибки, то скажете, что пишет или скрин под коврик положите.
Abrupt
Сообщения: 4
Зарегистрирован: Вт апр 20, 2021 21:52

Сообщение Abrupt »

Zmy
Сделал с аргументом 14 (перезаписать, одновременно, в нормальном окне), Параметры: 14 "%T" "%P%S"
в результате срабатывает только на файле под курсором, т.е. по-одному,
с файлами, названными по-русски не работает,
при использовании с JPG выдает ошибку

'Windows Script Host"
Строка: 46
Символ: 39
Ошибка: не удается дождаться процесса
Код: 80020009
Источник: WshShell.Run

Картинки мне форум не дает вставить...
Аватара пользователя
Zmy
Сообщения: 78
Зарегистрирован: Пн апр 06, 2015 12:52

Сообщение Zmy »

Посмотрел я, почему при ожидании стандартное средство просмотра фотографий Windows вываливается с ошибкой.
Потому что, оно запускается не просто так, а в процессе-оболчке (в обёртке, как svchost).
Только оно в dllhost.exe.
Т.е., сервер сценариев не может отследить окончание процесса, который назначен, как MIME-средство просмотра такого типа файла.
Измените средство просмотра для изображений по-умолчанию на прогу по-проще, тогда все проблемы исчезнут.
Типа, Imagine.exe или что-то другое.

На счёт руских символов, я вроде поправил. Вот, я даже снял видео.
Поставьте в настройках плеера качество 720.

https://disk.yandex.ru/i/4Tc0wnDBXwgh0w

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

// Команда:
// "C:\Folder\MoveToOther.js"
// Параметр:
// 17 "%T" "%P%S"

// Кавычки обязательны.
 
//  Skip    == 0
//  Count   == 1
//  Rewrite == 2
   
//  Wait    == 4
   
//  View    == 8    Normal
//  View    == 16   Turned
//  View    == 32   Maximaze

// В начале первый аргумент равен нулю. 
// Складываем флаги, чтобы получилось одно число. По группам. Пример: 
// Я хочу, чтобы при существованиии такого же файла в целевой директории включился счётчик (к первому аргументу прибавляю 1),
// или хочу перезаписать существующий файл (прибавляю 2).
// В противном случае, ничего не произойдёт.
// 
// Дальше. Я хочу, чтобы файлы запустились одновременно. Я к предыдущему итогу должен прибавить 4.
// Дальше. Я хочу окно в нормальном виде (прибавляю 8), или я хочу видеть в свёрнутом (прибавляю 16), или в максимальном виде (прибавляю 32).
// 
// В итоге, получаю сумму флагов. Например 17. Что значит, окно в свёрнутом виде, и прибавляется счётчик, при совпадении имён. 

// И первому аргументу присваиваю этот итог.    


function funcion(){var g=WScript.Arguments.length;if (g<3){WScript.Echo
('Wrong Parameteres.   \n\nExample: \n\n\n\nCommand:'+'     \n\n"C:\\Kemp\\MoveAndRun.js"\n\n\nArguments:\n\n17 "%T" "%P%S"');
WScript.Quit();};var z=WScript.Arguments(1),b=parseInt(WScript.Arguments(0),10),
k=new ActiveXObject("Scripting.FileSystemObject"),u=new ActiveXObject("WScript.Shell");if
(z.substr(z.length-1,z.length)=='\\'){z=z.substr(0,z.length-1);};z+="\\";if (!k.FolderExists(z)){
WScript.Echo('Target Folder not Exist.  \n\n\n'+z+" \n");k=u=0;WScript.Quit();};var i=2,n=w=r=t="",q=h=0;for(;i<g;i++)
{n=WScript.Arguments(i);q=n.lastIndexOf("\\");w=n.charAt(q);r=n.substr(parseInt(q,10)+1);h=r.lastIndexOf(".")+1;t=
r.substr(h);w=r.substr(0,parseInt(h,10)-1);h=n.substr(0,parseInt(q,10)+1);if (z.toLowerCase()==h.toLowerCase())
{WScript.Echo("Source and Target Folders Identical. \n\n\n"+h+"\n\n"+z+" \n");break;};q=1;h=z+r;if
(k.FileExists(h)){if (b&0x1){while(k.FileExists(h)){q+=1;h=z+w+"_"+q+"."+t;};}else if
(b&0x2){w=k.GetFile(h);if(w.attributes&1){w.attributes=0;WScript.Sleep(100);};k.DeleteFile(h);}else{continue;};};if
(!k.FileExists(n)){continue;};k.MoveFile(n,h);WScript.Sleep(500);t=(b&0x04)?1:0;if(b&0x10)
{w=2;}else if(b&0x20){w=3;}else{w=1;};u.Run('"'+h+'"',w,t);WScript.Sleep(200);};k=u=0;WScript.Quit();};funcion()

Abrupt
Сообщения: 4
Зарегистрирован: Вт апр 20, 2021 21:52

Сообщение Abrupt »

Zmy
Русские названия заработали, спасибо! Но у меня по прежнему отрабатывается только один файл под курсором, когда выделяешь все, ничего не происходит. И мне все-таки хотелось бы, чтобы файлы не нужно было выделять, а обрабатывались бы все файлы в активной панели, так можно сделать?
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

К запросу:
Написал VBS скрипт по переименованию файлов и папок по любым правилам (можно прописывать в правилах свои хотелки):
Сейчас скрипт переименовывает:
- по вашей же регулярке удаляет все небуквы, нецифры и непробелы
- заменяет все подчеркивания "_" на пробелы
- заменяет все двойные, тройные и т.п. пробелы на одиночные пробелы

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

'======================================================================
' Переименовать выделенные объекты по "своим" правилам

' Параметры:
' %WL 
'======================================================================
Option Explicit
Dim FSO, objRegEx, FileList, List, F, k, fn, ext, path, i
Set FSO  = CreateObject("Scripting.FileSystemObject")
Set objRegEx = CreateObject("VBScript.RegExp")
FileList = WScript.Arguments(0)
List     = Split(FSO.OpenTextFile(FileList,,,-1).ReadAll, vbNewLine)
For Each F In List
  If F <> "" Then
    path = FSO.getparentfoldername(F) & "\"
    if FSO.FolderExists(F) then
      fn = FSO.GetFolder(F).name ' Имя папки
      F=left(F, len(F)-1) ' удаление последнего обратного слэша
      k=1
    else
      fn = FSO.GetBaseName(F) ' Имя файла
      ext = "." & FSO.GetExtensionName(F) ' Расширение файла
      k=0
    end if
    
    ' ======= ПРАВИЛА ПЕРЕИМЕНОВАНИЯ ==============================
    objRegEx.Pattern = "[^\wА-Яа-яёЁ ]"
    objRegEx.Global = True
    fn = objRegEx.replace(fn, "")
    fn=replace(fn, "_", " ")
    for i=1 to 5 ' удаление всех задвоенных, затроенных и т.п. пробелов
      fn=replace(fn, "  ", " ")
    next
    ' =============================================================
    
    ' Непосредственно переименование
    if k=1 then
      FSO.MoveFolder F, path & fn ' переименование папок
    else
      FSO.MoveFile F, path & fn & ext ' переименование файлов
    end if

  End If
Next
Аватара пользователя
ZZZAlexZZZ
Сообщения: 68
Зарегистрирован: Сб мар 08, 2014 22:25

Сообщение ZZZAlexZZZ »

Monarch-LFV
Спасибо за скрипт. Можно уточнить: "(можно прописывать в правилах свои хотелки)" - имеется ввиду только в этой части

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

  objRegEx.Pattern = "[^\wА-Яа-яёЁ ]"
регулярку менять или есть способ внести дополнительные правило (второе, третье, и т.д.)?
Ответить