Выделение файлов через один

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

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

Аватара пользователя
LonerD
Сообщения: 1173
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Затих что-то я в последнее время... Надо чем-то полезным выделиться.
Скрипт AutoHotkey для выделения зеброй.
[s]При Branch view не работает.[/s]
При отображении файлов без каталогов теперь работает!
Зато нет ограничений на количество файлов в каталоге и выделение происходит очень быстро - system32 c около 4000 файлами - за секунду или быстрее; WinSxS с 22000 файлов с длинными именами - за 8-10 секунд.

Скрипт с параметрами.
Если не задавать параметры вообще - то выделяются через один файлы и каталоги, начиная с первого.
Если задать два параметра - то выделение происходит через один
Если задать один параметр - то выделение происходит через один, начиная с первого.

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

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Script:	SelectionZebra.ahk
; Build:		1.4 (2013.06.11-2015.04.20)
; Author:		LonerD
; OfSite:		http://dreamlair.net
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Выделение объектов в панели зеброю.
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Parameters:
;    1) Selection mode:
;       1 - all; 2 - only files; 3 - only dirs
;    2) Selection position:
;       1 - begin from 1st file; 2 - from 2nd; 10 - from 10th
;    3) Selection range:
;       2 - each 2nd file, 3 - each third file etc
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Параметры:
;    1) Метод выделения:
;       1 - всё; 2 - только файлы; 3 - только каталоги
;    2) Позиция выделения:
;       с какого файла начать выделение (с первого, второго, ... десятого, ... ит.д.)
;    3) Порядок выделения:
;       2 - каждый второй файл, 3 - каждый третий и т.д...
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#NoEnv
#NoTrayIcon
#SingleInstance force
SetBatchLines, -1

Mode = %1%
First = %2%
Range = %3%

If 0 < 3
  Range = 2
If 0 < 2
  First = 1
If Mode not in 1,2,3
  Mode = 1

WinGet, TCHWND, ID, ahk_class TTOTAL_CMD
DllCall("LockWindowUpdate", "uint", TCHWND)

ClipSaved := ClipboardAll
Clipboard := ""

SendMessage, 0x433, 2029,,, ahk_class TTOTAL_CMD
Path := Clipboard . "\"

SendMessage, 0x433, 524,,, ahk_class TTOTAL_CMD
SendMessage, 0x433, 330 . Mode,,, ahk_class TTOTAL_CMD
SendMessage, 0x433, 2021,,, ahk_class TTOTAL_CMD
Sleep, 100
FileList := Clipboard
Sleep, 100

Loop, Parse, FileList, `n, `r
{
  Strings := A_Index
  if ( Strings > 1 )
    Break
}
if ( Strings = 1 )
{
  SendMessage, 0x433, 3321,,, ahk_class TTOTAL_CMD
  SendMessage, 0x433, 2021,,, ahk_class TTOTAL_CMD
  SendMessage, 0x433, 524,,, ahk_class TTOTAL_CMD
  Sleep, 100
  FileList2 := Clipboard
  Sleep, 100
  Loop, Parse, FileList2, `n, `r
  {
    Strings2 := A_Index
    if ( Strings2 > 1 )
      Break
  }
  if ( Strings2 > 1 )
  {
    Loop, Parse, FileList2, `n, `r
    {
      if ( FileList = A_LoopField )
        Goto, Exit
    }
  }
}

SendMessage, 0x433, 524,,, ahk_class TTOTAL_CMD

StringReplace, Path, Path, `\`\, `\, All
StringReplace, FileList, FileList, % Path, , All

FileListSel := ""
Loop, Parse, FileList, `n, `r
{
  if ( Mod(A_Index - First + 1,Range) = 1 )
    FileListSel := FileListSel "`r`n" A_LoopField
}

Clipboard := FileListSel
SendMessage, 0x433, 2033,,, ahk_class TTOTAL_CMD

Exit:
Clipboard := ClipSaved
ClipSaved := ""
FileList := ""
FileListSel := ""

DllCall("LockWindowUpdate", "uint", 0)
Exit
Последний раз редактировалось LonerD Пн апр 20, 2015 17:57, всего редактировалось 11 раз.
Windows 11 | TC DreamLair eternal pre-α
Hjkma
Сообщения: 178
Зарегистрирован: Сб апр 18, 2015 01:26

Сообщение Hjkma »

LonerD
спасибо за скрипт! а если не через один файл, а два? можно ли как-нибудь переделать скрипт под эту задачу?
Аватара пользователя
LonerD
Сообщения: 1173
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Hjkma
Пожалуйста.

Через два файла:
заменить
if ( Mod(A_Index,2) = 1 )
на
if ( Mod(A_Index,3) = 1 )
или
if ( Mod(A_Index,3) = 0 )
(соответственно в первом случае выделится 1,4,7 и т.д. файлы, а во втором случае - 3,6,9 и т.д.)
Windows 11 | TC DreamLair eternal pre-α
Hjkma
Сообщения: 178
Зарегистрирован: Сб апр 18, 2015 01:26

Сообщение Hjkma »

LonerD

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

Сообщение Flasher »

Hjkma писал(а):наиболее удобный
Это вряд ли. Опций нет. Всё подряд выделяет.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Flasher
Кстати, твой скрипт, по ссылке из второго сообщения темы, с опциями 1 (всё) и 3 (только папки) тоже выделяет зеброй все папки, независимо от положения курсора в папках. Так и задумано?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Нет, конечно. Там со слэшем на конце какая-то история. Видимо, в тогдашней версии ТС он был не нужен.

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

'================================================================
' Выделить с заданным интервалом, начиная с элемента под курсором

' Условие: необходим компонент Script Helper ActiveX for TC

' Параметры: %Z%V <режим выделения> <шаг>
' Режим выделения: 1 - всё; 2 - только файлы; 3 - только папки
' Пример: %Z%V 2 5

' Автор: Flasher ©
'================================================================

Option Explicit
Dim V, Mode, Step, D, FSO, F, P, T1, T, Cl, List, T2, Start, i, n, Sp

With WScript.Arguments
  V = .Item(0) : Mode = .Item(1) : Step = .Item(2)
End With : Set D = CreateObject("Scripting.Dictionary")
Set FSO = CreateObject("Scripting.FileSystemObject")
With CreateObject("TCScript.Helper")
  F = Right(V, 1) : P = .GetSrcPath : V = Left(P, 1) & Mid(V, 2)
  If F = "\" And P <> "" Then P = V Else T1 = 1
  .Pause = 0 : .Wait = True : .LockTC True : T = .GetTextFromClip
  .SendCommand 524, True : If F = "\" Then .SendKeystroke "{DOWN}"
  .SendCommand 2018, True : Cl = .GetTextFromClip
  If Mode = 3 And Right(Cl, 1) <> "\" Then Quit
  .SendCommand 330&Mode, True : List = .GetSrcSelectedFiles(1)
  If Mode = 2 And Right(Cl, 1) = "\" Then Cl = List(0)
  If FSO.FileExists(P) And FSO.GetParentFolderName(V) <> P Then T2 = 1
  If P <> "" Then P = FSO.BuildPath(P, "\")
  If P = "" Or T2 Then Start = Cl Else Start = Mid(Cl, Len(P) + 1)
  If UBound(List) = 0 Then
    If (Right(List(0),1) <> "\" And Mode = 3) Or (Right(List(0),1) = "\" And Mode = 2) Then Quit
  End If : If F = "\" Then .SendKeystroke "{UP}"
  i = 0 : If T1 And T2 Then P = ""
  If P <> "" Then List = Split(vbCr & Join(List, vbCr), vbCr & P)
  For Each F in List : D.Add F, i : i = i + 1 : Next
  If D.Item(Start) = "" Then Start = 1 Else Start = D.Item(Start)
  For n = Start To UBound(List)
    Sp = Sp & List(n) & vbNewLine : n = n + Step
  Next : .SendCommand 524, True : .SetTextToClip(Sp)
  .SendCommand 2033, True : .LockTC False : .SetTextToClip(T)
End With

Sub Quit
  With CreateObject("TCScript.Helper")
    If F = "\" Then .SendKeystroke "{UP}"
    .SendCommand 524, True : .LockTC False : .SetTextToClip(T)
  End With : WScript.Quit
End Sub
Последний раз редактировалось Flasher Чт апр 30, 2015 12:45, всего редактировалось 21 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Flasher писал(а):Там со слэшем на конце какая-то история. Видимо, в тогдашней версии ТС он был не нужен.
Полагаю, что проблема существовала с самого начала: проверил на TC 7.56a – всё точно также.
С новым скриптом появилась ошибка в виде без подкаталогов и не решилась предыдущая проблема при выделении зеброй в архивах.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

sa писал(а):С новым скриптом появилась ошибка в виде без подкаталогов
Появилась или была? Такая задача изначально не ставилась, поэтому я её не стал реализовывать. Не вижу практической пользы выделять зеброй в таком режиме.
sa писал(а):не решилась предыдущая проблема при выделении зеброй в архивах
С %Z? Для определения типа элемента под курсором как минимум архиватор нужен. Стоит ли с этим заморачиваться? Другой вариант - дублировать имя со слешэм. Т.е. список будет вдвое больше.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

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

Сообщение Flasher »

sa писал(а):Догадаешься, кто поднял вопрос про кривизну срабатывания в таком режиме?
Поднял не с практической целью, а для информации, чтобы отметить. Ладно, ерунда, сделано.

Проблему архивов тоже решил.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1173
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher писал(а):Опций нет. Всё подряд выделяет.
Окей. Теперь есть опции. Можно выбрать выделение файлов/каталогов/всего, можно выбрать с какого файла/каталога начинать выделение и сколько пропускать при выделении.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Что-то криво выделяет. То через 3, то через 5, часть подряд, часть не выделено, потом опять, половину каталогов может не выделить, первый параметр вообще ничего не даёт.
"0 - с n-го файла/каталога" - какая-то странная опция. В чём его практический смысл?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1173
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher писал(а):Что-то криво выделяет. То через 3, то через 5, часть подряд, часть не выделено, потом опять, половину каталогов может не выделить,
Попробуй перед
Clipboard := FileListSel

Вставить
msgbox, % FileList
msgbox, % FileListSel
(отобразится список всех обрабатываемых файлов/каталогов, а затем список выделяемых)

Случайно не в Branch view выделяешь? Такой вариант не поддерживается.
Flasher писал(а):первый параметр вообще ничего не даёт.
Да, исправил.
Flasher писал(а):"0 - с n-го файла/каталога" - какая-то странная опция. В чём его практический смысл?
[s]Например, нужно выделить каждый третий файл.
При параметре равном 1 выделяются 1, 4, 7, 10 и т.д. файлы.
При параметре равном 0 выделяются 3, 6, 9, 12 и т.д. файлы[/s]
Уже не важно. Ещё немного усовершенствовал. Теперь выделение начинается с того файла/каталога, номер которого указан во втором параметре (по умолчанию с первого)
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):отобразится список всех обрабатываемых файлов/каталогов, а затем список выделяемых
Пусто. А с шагом 1 вообще ничего не выделяет.
LonerD писал(а):Случайно не в Branch view выделяешь? Такой вариант не поддерживается.
Не в нём. А что мешает сделать?
LonerD писал(а):Теперь выделение начинается с того файла/каталога, номер которого указан во втором параметре (по умолчанию с первого)
Ну, это же неудобно параметры каждый раз править. Как у меня не хочешь сделать?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить