Выделение файлов через один
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3, ... 10, 11, 12  Next  :| |:
Total Commander -> Автоматизация Total Commander

#16:  Author: LonerDLocation: Донецк PostPosted: Sat Mar 28, 2015 22:52
    —
Затих что-то я в последнее время... Надо чем-то полезным выделиться.
Скрипт AutoHotkey для выделения зеброй.
При Branch view не работает.
При отображении файлов без каталогов теперь работает!
Зато нет ограничений на количество файлов в каталоге и выделение происходит очень быстро - system32 c около 4000 файлами - за секунду или быстрее; WinSxS с 22000 файлов с длинными именами - за 8-10 секунд.

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

Code:
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; 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


Last edited by LonerD on Mon Apr 20, 2015 18:57; edited 11 times in total

#17:  Author: Hjkma PostPosted: Sat Apr 18, 2015 02:45
    —
LonerD
спасибо за скрипт! а если не через один файл, а два? можно ли как-нибудь переделать скрипт под эту задачу?

#18:  Author: LonerDLocation: Донецк PostPosted: Sat Apr 18, 2015 05:43
    —
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 и т.д.)

#19:  Author: Hjkma PostPosted: Sat Apr 18, 2015 14:51
    —
LonerD

Большое вам спасибо! Из всех скриптов, который я находил, именно Ваш наиболее удобный и простый в использовании!

#20:  Author: FlasherLocation: Москва PostPosted: Sat Apr 18, 2015 14:56
    —
Hjkma wrote:
наиболее удобный
Это вряд ли. Опций нет. Всё подряд выделяет.

#21:  Author: sa PostPosted: Sat Apr 18, 2015 19:31
    —
Flasher
Кстати, твой скрипт, по ссылке из второго сообщения темы, с опциями 1 (всё) и 3 (только папки) тоже выделяет зеброй все папки, независимо от положения курсора в папках. Так и задумано?

#22:  Author: FlasherLocation: Москва PostPosted: Sat Apr 18, 2015 23:10
    —
Нет, конечно. Там со слэшем на конце какая-то история. Видимо, в тогдашней версии ТС он был не нужен.
Code:
'================================================================
' Выделить с заданным интервалом, начиная с элемента под курсором

' Условие: необходим компонент 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


Last edited by Flasher on Thu Apr 30, 2015 13:45; edited 21 times in total

#23:  Author: sa PostPosted: Sun Apr 19, 2015 00:08
    —
Flasher wrote:
Там со слэшем на конце какая-то история. Видимо, в тогдашней версии ТС он был не нужен.
Полагаю, что проблема существовала с самого начала: проверил на TC 7.56a – всё точно также.
С новым скриптом появилась ошибка в виде без подкаталогов и не решилась предыдущая проблема при выделении зеброй в архивах.

#24:  Author: FlasherLocation: Москва PostPosted: Sun Apr 19, 2015 01:10
    —
sa wrote:
С новым скриптом появилась ошибка в виде без подкаталогов
Появилась или была? Такая задача изначально не ставилась, поэтому я её не стал реализовывать. Не вижу практической пользы выделять зеброй в таком режиме.
sa wrote:
не решилась предыдущая проблема при выделении зеброй в архивах
С %Z? Для определения типа элемента под курсором как минимум архиватор нужен. Стоит ли с этим заморачиваться? Другой вариант - дублировать имя со слешэм. Т.е. список будет вдвое больше.

#25:  Author: sa PostPosted: Sun Apr 19, 2015 02:04
    —
Flasher wrote:
Появилась или была?
Сообщение об ошибке раньше не выскакивало, а выделение, в самом деле, работало не верно.
Flasher wrote:
Не вижу практической пользы выделять зеброй в таком режиме.
А вот в скрипте от Volniy, на который я ссылался в пятом сообщении темы, этот вопрос решён. Догадаешься, кто поднял вопрос про кривизну срабатывания в таком режиме?

#26:  Author: FlasherLocation: Москва PostPosted: Sun Apr 19, 2015 03:35
    —
sa wrote:
Догадаешься, кто поднял вопрос про кривизну срабатывания в таком режиме?
Поднял не с практической целью, а для информации, чтобы отметить. Ладно, ерунда, сделано.

Проблему архивов тоже решил.

#27:  Author: LonerDLocation: Донецк PostPosted: Sun Apr 19, 2015 18:20
    —
Flasher wrote:
Опций нет. Всё подряд выделяет.

Окей. Теперь есть опции. Можно выбрать выделение файлов/каталогов/всего, можно выбрать с какого файла/каталога начинать выделение и сколько пропускать при выделении.

#28:  Author: FlasherLocation: Москва PostPosted: Sun Apr 19, 2015 19:18
    —
Что-то криво выделяет. То через 3, то через 5, часть подряд, часть не выделено, потом опять, половину каталогов может не выделить, первый параметр вообще ничего не даёт.
"0 - с n-го файла/каталога" - какая-то странная опция. В чём его практический смысл?

#29:  Author: LonerDLocation: Донецк PostPosted: Sun Apr 19, 2015 19:45
    —
Flasher wrote:
Что-то криво выделяет. То через 3, то через 5, часть подряд, часть не выделено, потом опять, половину каталогов может не выделить,


Попробуй перед
Clipboard := FileListSel

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

Случайно не в Branch view выделяешь? Такой вариант не поддерживается.

Flasher wrote:
первый параметр вообще ничего не даёт.

Да, исправил.

Flasher wrote:
"0 - с n-го файла/каталога" - какая-то странная опция. В чём его практический смысл?

Например, нужно выделить каждый третий файл.
При параметре равном 1 выделяются 1, 4, 7, 10 и т.д. файлы.
При параметре равном 0 выделяются 3, 6, 9, 12 и т.д. файлы

Уже не важно. Ещё немного усовершенствовал. Теперь выделение начинается с того файла/каталога, номер которого указан во втором параметре (по умолчанию с первого)

#30:  Author: FlasherLocation: Москва PostPosted: Sun Apr 19, 2015 21:53
    —
LonerD wrote:
отобразится список всех обрабатываемых файлов/каталогов, а затем список выделяемых
Пусто. А с шагом 1 вообще ничего не выделяет.
LonerD wrote:
Случайно не в Branch view выделяешь? Такой вариант не поддерживается.
Не в нём. А что мешает сделать?
LonerD wrote:
Теперь выделение начинается с того файла/каталога, номер которого указан во втором параметре (по умолчанию с первого)
Ну, это же неудобно параметры каждый раз править. Как у меня не хочешь сделать?



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3, ... 10, 11, 12  Next  :| |:
Page 2 of 12

Powered by phpBB © 2001, 2005 phpBB Group