View previous topic :: View next topic |
Author |
Message |
Orion9

Joined: 01 Jan 2024 Posts: 900
|
(Separately) Posted: Thu Oct 02, 2025 20:42 Post subject: |
|
|
Loopback
Ну что, покажем Гислеру, как надо цвет панелей менять?
 Hidden text Code: | RegisterCommand 70052 "BackColorSelect"
Func BackColorSelect(lParam)
Local bkg1, bkg2
IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
Local oCC = Callback("ColorChooseProc", "hwnd;uint;wparam;lparam")
Local cls = Buffer(64), buf = Buffer(auX64 ? 72 : 36)
cls.Zero()
cls.SetNum(0, "dword", 0x000000FF, _
"dword", 0x0000FF00, _
"dword", 0x00FF0000, _
"dword", 0x00FFFFFF, _
"dword", 0x00808080)
buf.Zero()
If auX64 Then
buf.SetNum(0, "dword", buf.size)
buf.SetNum(8, "hwnd", AUTORUN_TCHANDLE)
buf.SetNum(16, "hwnd", 0, _
"uint", bkg1)
buf.SetNum(32, "ptr", cls.ptr, _
"dword", 0x00000113)
buf.SetNum(48, "lparam", 0, _
"ptr", oCC.ptr)
Else
buf.SetNum(0, "dword", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"hwnd", 0, _
"uint", bkg1, _
"ptr", cls.ptr, _
"dword", 0x00000113, _
"lparam", 0, _
"ptr", oCC.ptr)
EndIf
If Not DllCall("comdlg32.dll\ChooseColorW", "ptr", buf.ptr, "bool") Then
WriteBackground(bkg1, bkg2)
EndIf
Free(buf, cls, oCC)
EndFunc
Func ColorChooseProc(hWnd, uMsg, wParam, lParam)
Static IDOK = 1, IDCANCEL = 2, WM_COMMAND = 0x0111
Static r, g, b, c, max = 1*255 + 256*255 + 65536*255, last = -2
If uMsg = WM_COMMAND Then
If wParam = IDOK Or wParam = IDCANCEL Then Return 0
r = WinGetText(WinFind(hWnd, "Edit", 4))
g = WinGetText(WinFind(hWnd, "Edit", 5))
b = WinGetText(WinFind(hWnd, "Edit", 6))
If StrLen(r) = 0 Then r = 0
If StrLen(g) = 0 Then g = 0
If StrLen(b) = 0 Then b = 0
c = 1*r + 256*g + 65536*b
WinSetText("RGB: " & r & ", " & g & ", " & b, hWnd)
If Not IsInt(c) Then Return 0
If c = last Then Return 0
If c >= -1 And c <= max Then
WriteBackground(c, c)
last = c
Endif
EndIf
Return 0
EndFunc
Func WriteBackground(Color1, Color2)
IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Color1%
IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Color2%
# обновление панелей
SendCommand 2957
SendCommand 2957
EndFunc |
 Hidden text TOTALCMD#BAR#DATA
70052
%COMMANDER_EXE%
Смена фона панелей
1
-1
Ну вот. А то всё диалоги да диалоги. Не по-швейцарски это. Или по-швейцарски?
A55555
Новая функция работает только с Everything, проверять условие не требуется. Т.е. вместо:
Code: | If bEverything Then CommandExec em_everything |
Можно просто посылать em_команду, например, после отображения прогресс-бара:
Code: | RunThread "WinFindTorrentData"
While g_FindTorrTask = 0
Sleep(50)
Wend
CommandExec em_everything |
А в конце выгружать Everything после подсчета времени операции:
Code: | T2 = Round(GetUptime() - T1, 0) / 1000
T3 = "Время поиска: " & StrFormat("%.3f", T2) & " sec"
CommandExec em_everything |
Старый поиск без Everything не может работать дольше прежнего, ничего вроде не менялось. Возможно, у вас диски другие добавились или буквы изменились. Для ускорения поиска на HDD тома NTFS должны индексироваться (эта галочка обычно стоит по умолчанию в Windows) и лучше исключить системный раздел из поиска, особенно если на нем не хранятся торрент-данные. Другие логические диски, где тоже ничего нет, лучше тоже исключить из поиска.
Для обратного поведения CapsLock нужно поставить "Not" после условия, т.е. заменить
Code: | # проверка CapsLock
If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then |
на Code: | # проверка CapsLock
If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then |
И вы были правы. В старой функции поиска была ошибка и CapsLock работал наоборот. В последней версии модуля я исправил эту оплошность:
Code: | IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then |
Code: | If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then
SetHintParam("ShowHint", "Font", 15, "Arial") |
Вам тоже нужно добавить "Not" во втором случае, а в первом его убрать.
Что касается недокаченных раздач, то термин изначально был выбран неправильно. Речь идет о частично закаченных раздачах, как вы верно определили. Соответственно, поиск по размеру не будет давать результата. Можно попробовать в клиенте поставить опцию, чтобы дисковое пространство распределялось сразу, но не уверен, что это поможет.
Да, если в торрент-файле много мелких файлов, то поиск может длиться долго, но не бесконечно. Чем больше мелких файлов, тем больше результатов возвращает Everything и тем медленне все делается. К сожалению, Blu-Ray диски этим грешат. Они содежат много мелких файлов, которые ко всему прочему совпадают по именам и структуре каталогов с другими Blu-Ray дисками. Алгоритм поиска нужно улучшать, чтобы принимать во внимание только большие файлы. Но можно в настройках Everything исключить ненужные диски из индексации. Это должно ускорить поиск. В принципе режим "Имя+размер" должен быстро работать по сравнению с другими режимами, и достоверности от него больше, если какие-то файлы были полностью закачены. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 900
|
(Separately) Posted: Fri Oct 03, 2025 00:25 Post subject: |
|
|
A55555
Проблему с зависанием удалось воспроизвести. Один раз у меня действительно зависло на поиске Blu-Ray, но больше, сколько бы я не пытался повторить, этого не произошло. Пока не ясно, в чем причина, но было похоже, что Everything просто перестала отвечать на запросы. Вернее, она не ответила на последний запрос, в результате все так и зависло к концу операции. Это навело меня на мысль, что нужно сделать проценты поиска и какую-то информацию по памяти (хоть какую-то, вдруг она там очень сильно отжирается). Замените эти два блока.
Code: | # локальные переменные
Local T1 = GetUptime(), T2 = T1, T3, bSpeed = 0, bDbg = 1, nRes = 0
Local bName = Not b_Shift, bSize = Not b_CTRL, sSize, sMode, sMem, sDbg
Local j, nCount, sRes, nError, sList, sDirs, aQuery = List(), aCount = List()
|
Code: | # размер файла
If bSize Then
sSize = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr")
EndIf
sDbg = Round(j/(nCount-1)*100,0) & '% - '
If bDbg Then
nRes += StrLen(sRes) + 8
sMem = StrLen(sList) + StrLen(sDirs) + nRes
sDbg &= SizeFormat(sMem*2, 1, 'G', 2) & ' - '
EndIf
# меньше сообщений окну прогресса
If bSpeed Then
T3 = GetUptime()
If Round(T3 - T2, 0) > 250 Then
WinSetText(sDbg & sRes, h_WinFindTorr)
T2 = T3
EndIf
Else
WinSetText(sDbg & sRes, h_WinFindTorr)
EndIf |
Позже, когда информация о памяти не будет нужна, поменяйте bDbg = 1 на bDbg = 0. Если это действительно проблема взаимодействия с Everything (какой-то баг), то скорее всего ничего не поделаешь. |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 63
|
(Separately) Posted: Fri Oct 03, 2025 00:54 Post subject: |
|
|
Orion9 wrote: | A55555
Новая функция работает только с Everything, проверять условие не требуется. Т.е. вместо:
Code: | If bEverything Then CommandExec em_everything |
Можно просто посылать em_команду, например, после отображения прогресс-бара:
Code: | RunThread "WinFindTorrentData"
While g_FindTorrTask = 0
Sleep(50)
Wend
CommandExec em_everything |
А в конце выгружать Everything после подсчета времени операции:
Code: | T2 = Round(GetUptime() - T1, 0) / 1000
T3 = "Время поиска: " & StrFormat("%.3f", T2) & " sec"
CommandExec em_everything |
|
Orion9
спасибо, но стартовать не успевает, поставил буквально в самое начало функции запуск
Code: | CommandExec em_everything |
выход в том месте где вы подсказали нормально срабатывает
Code: | CommandExec em_everything_exit |
Orion9 wrote: | Для обратного поведения CapsLock нужно поставить "Not" после условия, т.е. заменить
Code: | # проверка CapsLock
If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then |
на
Code: | # проверка CapsLock
If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then |
|
Спасибо, помогло и на старом и на новом поиске.
Orion9 wrote: | Что касается недокаченных раздач, то термин изначально был выбран неправильно. Речь идет о частично закаченных раздачах, как вы верно определили. Соответственно, поиск по размеру не будет давать результата. Можно попробовать в клиенте поставить опцию, чтобы дисковое пространство распределялось сразу, но не уверен, что это поможет. |
Да, вроде как сразу распределяет, размер показывает полный, но не на 100% совпадающий с тем что на сайте раздачи указан.
Я больше про то, что функция не найдя по размеру, сама не попыталась найти вторым способом по имени. Или тут имеется ввиду, что они друг без друга не могут в по умолчанию режиме?
Когда я её заставляю именно по имени при помощи Crtl поискать, то находит.
Orion9 wrote: | A55555
Проблему с зависанием удалось воспроизвести. Один раз у меня действительно зависло на поиске Blu-Ray, но больше, сколько бы я не пытался повторить, этого не произошло. |
Да, зависание не стабильное, сегодня нормально работало, летало, потом снова зависло на этом Blu-Ray.
Orion9 wrote: | Замените эти два блока.
Code: | # локальные переменные
Local T1 = GetUptime(), T2 = T1, T3, bSpeed = 0, bDbg = 1, nRes = 0
Local bName = Not b_Shift, bSize = Not b_CTRL, sSize, sMode, sMem, sDbg
Local j, nCount, sRes, nError, sList, sDirs, aQuery = List(), aCount = List()
|
Code: | # размер файла
If bSize Then
sSize = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr")
EndIf
sDbg = Round(j/(nCount-1)*100,0) & '% - '
If bDbg Then
nRes += StrLen(sRes) + 8
sMem = StrLen(sList) + StrLen(sDirs) + nRes
sDbg &= SizeFormat(sMem*2, 1, 'G', 2) & ' - '
EndIf
# меньше сообщений окну прогресса
If bSpeed Then
T3 = GetUptime()
If Round(T3 - T2, 0) > 250 Then
WinSetText(sDbg & sRes, h_WinFindTorr)
T2 = T3
EndIf
Else
WinSetText(sDbg & sRes, h_WinFindTorr)
EndIf |
Позже, когда информация о памяти не будет нужна, поменяйте bDbg = 1 на bDbg = 0. Если это действительно проблема взаимодействия с Everything (какой-то баг), то скорее всего ничего не поделаешь. |
Ошибку при запуске поиска выкинуло
 Hidden text
OK нажал и всё равно нашло.
Выскакивает только когда ищется одиночный безпапковый например mkv файл.
Папки ищет без ошибки.
Нужно наблюдать, время покажет, но ту Blu-Ray папку теперь ищет нормально.
Эх, всё-таки снова подвисло
 Hidden text
закрыл, снова запустил, на 58% зависло.
Закрыл 58%, снова запустил, нормально нашло.
В любом случае, даже вот так как сейчас, это просто супер. Спасибо. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 900
|
(Separately) Posted: Sat Oct 04, 2025 00:40 Post subject: |
|
|
A55555 wrote: | Ошибку при запуске поиска выкинуло |
Типичная ошибка ночных версий ) Вместо
Code: | sDbg = Round(j/(nCount-1)*100,0) & '% - ' |
должно быть
Code: | sDbg = Round((j+1)/nCount*100,0) & '% - ' |
Исправил первым делом. Хотя изменений еще много. Судя по скрину, вы подключили модуль - правильно сделали, теперь обновляться будет легче.
A55555 wrote: | спасибо, но стартовать не успевает, поставил буквально в самое начало функции запуск |
А зачем вам запускать и выгружать Everything в каждой операции? Меня не напрягает ручное включение и выключение. Но в обновленном модуле предусмотрел такую опцию.
Code: | Global gEvPath = COMMANDER_PATH & "\Everything.exe", gEvAuto = 0, gEvDelay = 100 |
Если gEvAuto = 1, то будет автозапуск и выгрузка Everything при каждой операции. gEvDelay - задержка в миллисекундах после запуска на случай, если Everything не успевает стартовать.
Также добавил опцию для CapsLock.
Code: | Global gTorrentDbg = 0, gDbgStep, gCapsReverse = 0 |
gCapsReverse = 1 задает обратное поведение. gTorrentDbg и gDbgStep используются для отладочной информации. Alt+0 - включает и выключает режим отладки, а Alt+Win+0 выводит информацию на экран и копирует ее в буфер. Когда в следующий раз зависнет, не помешает посмотреть на каком шаге зависло.
A55555 wrote: | Да, вроде как сразу распределяет, размер показывает полный, но не на 100% совпадающий с тем что на сайте раздачи указан. |
В клиенте есть опция для полного распределения дискового пространства для новой раздачи сразу после ее старта. На бумаге должно работать, но надо проверять. Могут быть нюансы.
A55555 wrote: | Я больше про то, что функция не найдя по размеру, сама не попыталась найти вторым способом по имени. Или тут имеется ввиду, что они друг без друга не могут в по умолчанию режиме? |
Было отдельно, сейчас немного подправил. Теперь предлагается продолжить с другим режимом, если не было ничего найдено в текущем. Автоперехода между режимами не будет - может произойти прыжок не пойми куда, особенно если искать только по размерам. Какой-никакой контроль со стороны пользователя все-таки нужен.
A55555 wrote: | закрыл, снова запустил, на 58% зависло.
Закрыл 58%, снова запустил, нормально нашло. |
Теперь можно будет перед началом операции включить отладку (Alt+0), и когда зависнет Alt+Win+0. На экране и в буфере будет информация, запостите ее на форум. Последняя версия модуля:
 Torrent.aucfg Code: | #Pragma IncludeOnce
# 70500-70599
RegisterCommand 70500 "TorrentFindData" 0
RegisterCommand 70501 "TorrentFindData" 1
RegisterCommand 70502 "GoToPathFromTextFile"
RegisterCommand 70503 "ToggleEverything"
RegisterCommand 70504 "FindTorrentParts"
RegisterCommand 70505 "TorrentSize"
RegisterCommand 70506 "TorrentFindOptions"
RegisterCommand 70507 "TorrentDebugInfo"
SetHotkeyAction /K:A /H:0 /DM /S TorrentDebugInfo
SetHotkeyAction /K:A /K:W /H:0 /DM /S TorrentFindOptions
Global gEvPath = COMMANDER_PATH & "\Everything.exe", gEvAuto = 0, gEvDelay = 100
Global gTorrentDbg = 0, gDbgStep, gCapsReverse = 0
Global gTorrentSize = 0, gTorrentCount = 0, gDriveInclude = "e:\;f:\;g:\;h:\;i:\;j:\"
Global h_WinFindTorr = 0
Global g_WinFindTorr = 0, g_FindTorrTask = 0
Global o_WinFindTorr = Callback("WinFindTorrProc", "hwnd;uint;wparam;lparam")
Func WinFindTorrProc(hWnd, uMsg, wParam, lParam)
Static WM_CLOSE = 0x0010
If uMsg = WM_CLOSE Then
If DllCall("DestroyWindow", "handle", hWnd) Then
h_WinFindTorr = 0
g_FindTorrTask = 0
EndIf
Return 0
EndIf
Return DllCall("CallWindowProcW", "ptr", g_WinFindTorr, _
"hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam)
EndFunc
Func WinFindTorrentData()
Local hIco
h_WinFindTorr = DllCall("CreateWindowExW", _
"dword", 0, _
"wstr", "msctls_progress32", _
"wstr", "", _
"dword", 0x00C80000, _
"int", 200, "int", 100, "int", Scale(400), "int", Scale(50), _
"handle", AUTORUN_TCHANDLE, _
"handle", 0, "handle", 0, "ptr", 0, "handle")
If h_WinFindTorr = 0 Then Return 0
WinAlign(h_WinFindTorr, 0, DllCall("GetDesktopWindow"))
WinSetPos("", -Scale(50), "", "", 1, h_WinFindTorr)
WinSetState(5, h_WinFindTorr)
g_WinFindTorr = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
"hwnd", h_WinFindTorr, _
"int", -4, _
"long_ptr", o_WinFindTorr.Ptr, "ptr")
Static PBS_MARQUEE = 0x08, _
PBM_SETMARQUEE = 1034, _
WM_GETICON = 0x7f, _
WM_SETICON = 0x80
hIco = SendMessage(AUTORUN_TCHANDLE, WM_GETICON, 2, 0)
SendMessage(h_WinFindTorr, WM_SETICON, 0, hIco)
WinSetStyle(PBS_MARQUEE, 2, h_WinFindTorr)
SendMessage(h_WinFindTorr, PBM_SETMARQUEE, 1, 0)
WinSetText("Searching...", h_WinFindTorr)
g_FindTorrTask = 1
While g_FindTorrTask
Sleep(50)
Wend
h_WinFindTorr = 0
EndFunc
Func TorrentFindData(lParam, nMode)
If IsPressed(0x10) And Not nMode Then
SetTorrentDrives()
Return
EndIf
Local bEverything = nMode
If h_WinFindTorr Then
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
g_FindTorrTask = 0
Return
Endif
Static buf = Buffer(256)
buf.Zero()
Local nSymb = DllCall("GetLogicalDriveStringsW", "dword", buf.size, "ptr", buf.ptr)
If Not nSymb Then
MsgBox("Не удалось получить список логических дисков" & auCRLF "SYSERROR: " & SYSERROR, "Autorun")
Return
EndIf
Static aDrive = List(), aFound = List()
Local i = 0, sz, sDrives
aDrive.Count = 0
While 1
sDrive = buf.GetStr(i)
sz = StrLen(sDrive)
If sz = 0 Then break
aDrive.add(sDrive)
i = i + sz*2 + 2
Wend
sDrives = aDrive.text
#MsgBox(sDrives)
Local obj = Plugin("TCTorrent")
If ERROR <> 0 Then
ShowHint("TCTorrent.wdx plugin error " & ERROR)
Return
Endif
Local lRet = false
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
lRet = true
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Каталог " & sFile)
lRet = true
ElseIf FileGetSize(sFile) > 1024*1024*5 Then
ShowHint("Размер файла больше 5 Мб " & sFile)
lRet = true
Else
obj.FileName = sFile
Local name = obj.GetValue(0)
Local size = obj.GetValue(2,0) # size -> bytes
Local files = obj.GetValue(1)
If files < 1 Then
ShowHint("Файл не является торрент-файлом " & sFile)
lRet = true
EndIf
Endif
Free(obj)
If lRet Then Return
IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
Local bCaps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
If gCapsReverse Then bCaps = Not bCaps
If Not bCaps Then
MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _
"Имя: " & name & auCRLF & _
"Размер: " & size & auCRLF & _
"Файлов: " & files & auCRLF & auCRLF & _
"Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _
"Продолжить?", "Autorun", 3+32+0)
If EXTENDED <> 6 Then Return
Endif
If bEverything Then
If gEvAuto And Not ProcessExist("Everything.exe") Then
ShellExec(gEvPath, "-startup")
Sleep(gEvDelay)
EndIf
EndIf
aFound.Count = 0
gTorrentSize = size
h_WinFindTorr = 0
gTorrentCount = 0
RunThread "WinFindTorrentData"
While g_FindTorrTask = 0
Sleep(50)
Wend
Local found
If bEverything Then
found = FileFindEv("size:" & gTorrentSize, "", "sort:3")
Local nError = ERROR
If nError = 1 Then MsgBox("Не найдено окно Everything.")
If nError = 2 Then MsgBox("Ошибка выполнения запроса к IPC Everything.")
If nError > 0 Then
g_FindTorrTask = 0
Return
EndIf
Else
For i = 0 to aDrive.Count -1
If StrPos(gDriveInclude, aDrive[i]) Then
If files > 1 Then
found &= FileFind(aDrive[i], "*.*", 1, 2, "PathList", "Func:FindTorrentDir") & auCRLF
Else
found &= FileFind(aDrive[i], "*.*", 1, 1, "PathList", "Func:FindTorrentFile") & auCRLF
EndIf
Endif
Next
EndIf
found = StrTrim(found)
aFound.Text = found
If bEverything Then gTorrentCount = aFound.Count
If bEverything And gEvAuto Then ShellExec(gEvPath, "-exit")
If g_FindTorrTask = 0 Then
If gTorrentCount = 0 Then
MsgBox("Поиск отменен" & auCRLF & auCRLF & _
"Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 48)
Else
MsgBox("Поиск отменен" & auCRLF & auCRLF & _
"Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _
"Сохранить в текстовый файл?", "Autorun", 3+48+0)
If EXTENDED = 2 Then Return
If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
EndIf
Else
g_FindTorrTask = 0
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
If gTorrentCount = 0 Then
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 64)
Else
bCaps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
If gCapsReverse Then bCaps = Not bCaps
If bCaps Then
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Автопереход к найденному", 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(100)
SetHintParam("ShowHint", "Reload")
GoToPathFromMsg(aFound[0])
Return
EndIf
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _
"Сохранить в текстовый файл?", "Autorun", 3+64+0)
If EXTENDED = 2 Then Return
If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
EndIf
EndIf
EndFunc
Func SaveDataPathToText(Filename, DataPath)
Local file = FileChangeExt(Filename, "txt"), bGoto = false
If FileExist(file) Then
MsgBox("Файл существует" & auCRLF & auCRLF & _
file & auCRLF & auCRLF & "Перезаписать?", "Autorun", 3+32+0)
If EXTENDED <> 6 Then Return
EndIf
FileWrite(file, DataPath)
#MsgBox("Файл сохранен " & auCRLF & auCRLF & file, "Autorun", 64)
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Файл сохранен", 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(100)
SetHintParam("ShowHint", "Reload")
If bGoto Then
If RequestInfo(1000) = 1 Then
CommandExec /CD %'file'
Else
CommandExec /CD '' %'file'
Endif
Endif
EndFunc
Func GoToPathFromTextFile()
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
Return
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Файл является каталогом " & sFile)
Return
ElseIf FileGetExt(sFile) <> "TXT" Then
ShowHint("Расширение файла не .txt " & sFile)
Return
ElseIf FileGetSize(sFile) > 1024*2 Then
ShowHint("Размер файла больше 2 Кб " & sFile)
Return
EndIf
Local txt = FileRead(sFile)
Local target = StrPart(txt, auCRLF, 1)
If target <> "" Then
GoToPathFromMsg(target)
Else
ShowHint("Пустой путь" & target)
EndIf
EndFunc
Func GoToPathFromMsg(Target)
If FileExist(Target) Then
If RequestInfo(1000) = 2 Then
CommandExec /CD %'Target'
Else
CommandExec /CD '' %'Target'
Endif
SendCommand(4006)
If StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Else
ShowHint("Путь не существует " & Target)
EndIf
EndFunc
Func FindTorrentFile(file)
Static T1 = GetUptime()
If Not g_FindTorrTask Then Return 0
If Round(GetUptime() - T1, 0) > 200 Then
WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
T1 = GetUptime()
Sleep(5)
EndIf
If file.size = gTorrentSize Then
gTorrentCount += 1
Return 1
EndIf
Return 2
EndFunc
Func FindTorrentDir(file)
Static T2 = GetUptime()
If Not g_FindTorrTask Then Return 0
If Round(GetUptime() - T2, 0) > 200 Then
WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
T2 = GetUptime()
Sleep(5)
EndIf
Local sz = FileFind(file.FullPath, "*.*", 1, 0, "TotalSize")
If sz = gTorrentSize Then
gTorrentCount += 1
Return 1
EndIf
Return 2
EndFunc
Global gVbsInputBox
Func SetTorrentDrives()
Local out, drives, vbs
IniRead drives %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
vbs = '/c ECHO Wscript.Echo Inputbox("Search on these disks:","Autorun","' & drives & '")>%TEMP%\~auto_0001.vbs'
ProcessExecGetOutput out %COMSPEC% %vbs%
gVbsInputBox = 1
RunThread("WinVbsInputBoxActivate")
ProcessExecGetOutput /OEM out "cscript.exe" "/nologo ~auto_0001.vbs" %TEMP%
gVbsInputBox = 0
out = StrTrim(out)
If out = "" Then Return
IniWrite %COMMANDER_INI% "Autorun" "TorrentDrives" %out%
Sleep(50)
MsgBox("Ключ сохранен.", "Autorun", 64)
EndFunc
Func WinVbsInputBoxActivate()
Local hVbs
While gVbsInputBox
hVbs = WinFind(0, "#32770", "Autorun")
If hVbs > 0 Then
WinSetState(23, hVbs)
Break
EndIf
Sleep(50)
Wend
EndFunc
Func TorrentSize(lParam)
Local T1 = GetUptime()
Local obj = Plugin("TCTorrent")
If ERROR <> 0 Then
ShowHint("TCTorrent.wdx plugin error " & ERROR)
Return
Endif
Local size = 0, files = 0
Local aSel = List()
aSel.Text = GetSelectedItems(3, 0)
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
Local lRet = false
If aSel.Count = 0 Then
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
lRet = true
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Каталог " & sFile)
lRet = true
Else
obj.FileName = sFile
files = obj.GetValue(1)
size = obj.GetValue(2,0) # size -> bytes
Free(obj)
Endif
EndIf
If lRet Then
Free(obj, aSel)
Return
EndIf
If aSel.Count > 10 Then
ShowHint("Выделено: " & aSel.Count & auCRLF & "Подсчёт времени...")
EndIf
Local j, k = 0, dirs = 0, torrs = 0
If aSel.Count > 0 Then
For j = 0 To aSel.Count - 1
sFile = sPath & aSel[j]
If FileExist(sFile) Then
k += 1
If Not StrPos(FileGetAttr(sFile), "D") Then
obj.FileName = sFile
s = obj.GetValue(2,0)
If s > 0 Then
size += s
files += obj.GetValue(1)
torrs += 1
Endif
Else
dirs += 1
Endif
EndIf
Next
sName = "S/A: " & aSel.Count & "/" & k # Selected / Available
Else
SetHintParam("ShowHint", "Font", 10, "")
ShowHint("" & sName & auCRLF & _
"Размер: " & SizeFormat(size, 1, 'G', 2, 1) & auCRLF & _
"Файлов: " & files)
Sleep(100)
SetHintParam("ShowHint", "Reload")
Free(aSel)
Return
EndIf
Local tl = Round(GetUptime() - T1, 0) / 1000
SetHintParam("ShowHint", "Font", 10, "")
ShowHint((k = aSel.Count ? "" : "Файл " & sName & auCRLF) & _
"Элементов: " & aSel.Count & auCRLF & _
"Обработано: " & torrs & auCRLF & _
"Каталогов: " & dirs & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'M', 2) & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'G', 2) & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'T', 4) & auCRLF & _
"Файлов: " & files & auCRLF & _
"Powered by TCTorrent.wdx" & auCRLF & _
"Время операции: " & StrFormat("%.3f", tl) & " sec")
Sleep(100)
SetHintParam("ShowHint", "Reload")
Free(obj, aSel)
EndFunc
Func ToggleEverything()
If Not ProcessExist("Everything.exe") Then
CommandExec em_everything
Else
CommandExec em_everything_exit
Endif
EndFunc
Func TerminateEverything()
CommandExec em_everything_exit
EndFunc
# original function by Loopback
Func TorrentInfo(sFile)
Static aFixed = List('Name', 'TotalSize', 'FileCount', 'BlockSize', 'BlockCount', _
'Created', 'Creator', 'Hash', 'Comment', 'Encoding', _
'Multifile', 'PrivateTorrent', 'Publisher', 'PublisherURL')
Static aMulti = List('Tracker', 'Webseed', 'Error', 'CustomField')
Static sLibName = "TCTorrent.wlx" & (auX64 ? "64" : "")
Static sLibPath = COMMANDER_PATH & "\Plugins\wlx\TCTorrent\" & sLibName
Local hDll = DllCall("LoadLibrary", "wstr", sLibPath, "handle")
If hDll = 0 Then Return
Local hHandle = DllCall(sLibName & "\TorrentOpen", "wstr", sFile, "handle")
If hHandle = 0 Then
DllCall("FreeLibrary", "handle", hDll)
Return
EndIf
Local nCount, sRes
For i = 0 to aFixed.Count - 1
sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aFixed[i], "int", 0, "wstr")
OutputDebugString(aFixed[i] & ": " & sRes)
Next
OutputDebugString(auCRLF & 'Files:')
nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", "File", "uint")
For j = 0 To nCount - 1
sRes = StrFormat("[%12s] %s", _
DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr"), _
DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "File", "int", j, "wstr"))
OutputDebugString(sRes)
Next
For i = 0 to aMulti.Count - 1
OutputDebugString(auCRLF & aMulti[i] & 's:')
nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", aMulti[i], "uint")
For j = 0 To nCount - 1
sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aMulti[i], "int", j, "wstr")
OutputDebugString(sRes)
Next
Next
DllCall(sLibName & "\TorrentClose", "handle", hHandle)
DllCall("FreeLibrary", "handle", hDll)
EndFunc
Func FindTorrentParts(lParam)
# модификаторы вызова
Local b_CTRL = IsPressed (0x11), b_Shift = IsPressed (0x10)
If lParam = 1 Then b_CTRL = true
If lParam = 2 Then b_Shift = true
# повторный вызов при запущенной задаче
If h_WinFindTorr Then
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
g_FindTorrTask = 0
Return
Endif
If gEvAuto And Not ProcessExist("Everything.exe") Then
ShellExec(gEvPath, "-startup")
Sleep(gEvDelay)
Endif
# имя файла под курсором
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
# файл не существует или является каталогом
If Not FileExist(sFile) Then
ShowHint("File doesn't exist " & sFile)
Return
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Not a torrent file " & sFile)
Return
ElseIf FileGetSize(sFile) > 1024*1024*5 Then
ShowHint("File size > 5 Mb " & sFile)
Return
EndIf
# путь к библиотеке плагина
Static sLibName = "TCTorrent.wlx" & (auX64 ? "64" : "")
Static sLibPath = COMMANDER_PATH & "\Plugins\wlx\TCTorrent\" & sLibName
# не удалось загрузить библиотеку
Local hDll = DllCall("LoadLibrary", "wstr", sLibPath, "handle")
If hDll = 0 Then
ShowHint("TCTorrent.wlx can't load library " & sLibPath)
Return
EndIf
# библиотеке не удалось открыть файл
Local hHandle = DllCall(sLibName & "\TorrentOpen", "wstr", sFile, "handle")
If hHandle = 0 Then
ShowHint("TCTorrent.wlx can't open file " & sFile)
DllCall("FreeLibrary", "handle", hDll)
Return
EndIf
# файл не является торрент-файлом
Local nFiles
nFiles = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileCount", "int", 0, "wstr")
If nFiles < 1 Then
ShowHint("Corrupt torrent file " & sFile)
DllCall(sLibName & "\TorrentClose", "handle", hHandle)
DllCall("FreeLibrary", "handle", hDll)
Return
EndIf
# окно прогресса операции
h_WinFindTorr = 0
RunThread "WinFindTorrentData"
While g_FindTorrTask = 0
Sleep(50)
Wend
# локальные переменные
Local T1 = GetUptime(), T2 = T1, T3, bSpeed = 0, nRes = 0
Local bName = Not b_Shift, bSize = Not b_CTRL, sSize, sMode, sMem, sDbg
Local j, nCount, sRes, nError, sList, sDirs, aQuery = List(), aCount = List()
Static aMode = List("«Имя и размер»", "«Только имя»", "«Только размер»")
If bName And bSize Then
nMode = 0
ElseIf bName Then
nMode = 1
Else
nMode = 2
EndIf
sMode = aMode[nMode]
# количество файлов в торренте
nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", "File", "uint")
# перечисление файлов в торренте
For j = 0 To nCount - 1
If gTorrentDbg Then gDbgStep = "Step 1. TorrentGet j=" & j & auCRLF
# имя файла
sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "File", "int", j, "wstr")
# размер файла
If bSize Then
sSize = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr")
EndIf
sDbg = Round((j+1)/nCount*100,0) & '% - '
If gTorrentDbg Then
nRes += StrLen(sRes) + 8
sMem = StrLen(sList) + StrLen(sDirs) + nRes
sDbg &= SizeFormat(sMem*2, 1, 'G', 2) & ' - '
EndIf
If gTorrentDbg Then gDbgStep &= "Step 2. WinSetText " & sRes & auCRLF
# меньше сообщений окну прогресса
If bSpeed Then
T3 = GetUptime()
If Round(T3 - T2, 0) > 250 Then
WinSetText(sDbg & sRes, h_WinFindTorr)
T2 = T3
EndIf
Else
WinSetText(sDbg & sRes, h_WinFindTorr)
EndIf
If gTorrentDbg Then gDbgStep &= "Step 3. FileFindEv " & sRes & auCRLF
# запрос к Everything
If bName And bSize Then
aQuery.Text = FileFindEv('*\"' & sRes & '" size:' & sSize, "", "")
ElseIf bName Then
aQuery.Text = FileFindEv('*\"' & sRes & '"', "", "")
Else
aQuery.Text = FileFindEv('size:' & sSize, "", "")
EndIf
# ошибка запроса
nError = ERROR
If nError > 0 Then Break
If gTorrentDbg Then gDbgStep &= "Step 4. aCount.Add" & auCRLF
# обработка запроса
aCount.Add("[" & aQuery.Count & "] " & sRes)
If aQuery.Count > 0 Then
If gTorrentDbg Then gDbgStep &= "Step 5. sList" & auCRLF
sList &= aQuery.Text & auCRLF
If gTorrentDbg Then gDbgStep &= "Step 6. sDirs" & auCRLF
If nFiles > 1 Then
If gTorrentDbg Then gDbgStep &= "Step 7. StrReplace" & auCRLF
sDirs &= StrReplace(aQuery.Text, sRes, "") & auCRLF
Else
sDirs &= aQuery.Text & auCRLF
EndIf
Else
If gTorrentDbg Then
gDbgStep &= "Step 5. Skip" & auCRLF
gDbgStep &= "Step 6. Skip" & auCRLF
gDbgStep &= "Step 7. Skip" & auCRLF
EndIf
EndIf
If gTorrentDbg Then gDbgStep &= "Step 8. Next"
#Sleep(3000)
# опрерация прервана закрытием окна прогресса
If g_FindTorrTask = 0 Then Break
Next
If nError = 1 Then MsgBox("Everything window not found.")
If nError = 2 Then MsgBox("IPC Everything query execution error.")
If nError > 0 Then
g_FindTorrTask = 0
Free(aCount, aQuery)
DllCall(sLibName & "\TorrentClose", "handle", hHandle)
DllCall("FreeLibrary", "handle", hDll)
Return
EndIf
Local c = 0, m = Map(), top5 = List(), sTop5, bDirs = StrLen(StrTrim(sDirs))
# суммирование путей при непустом результате
If g_FindTorrTask And bDirs Then
aQuery.Text = sDirs
For value In aQuery
c = 1
If m.Has(value) Then c += m.Get(value)
m.Set(value, c)
Next
EndIf
# сортировка путей по убыванию
If g_FindTorrTask And bDirs Then
top5.SortMethod = 1
For key, value In m
top5.Add("[" & value & "]" & Chr(160) & key)
Next
top5.Sort(1)
# выбор верхних пяти путей
For j = 0 To top5.Count - 1
sTop5 &= top5[j] & auCRLF
If j >= 5 Then Break
Next
EndIf
c = top5.Count
Local top1, files = aCount.Text
If c > 0 Then top1 = StrTrim(StrPart(top5[0], Chr(160), 2))
# освобождение объектов и библиотеки
Free(aCount, aQuery, top5, m)
DllCall(sLibName & "\TorrentClose", "handle", hHandle)
DllCall("FreeLibrary", "handle", hDll)
# время операции
T2 = Round(GetUptime() - T1, 0) / 1000
T3 = "Время поиска: " & StrFormat("%.3f", T2) & " sec"
If gEvAuto Then ShellExec(gEvPath, "-exit")
If g_FindTorrTask = 0 Then
MsgBox("Поиск отменен", "Autorun", 48)
Else
# закрытие окна прогресса
g_FindTorrTask = 0
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
# ничего не найдено
If c = 0 Then
If nMode < 2 Then
MsgBox("Найдено: " & c & auCRLF & auCRLF & _
"Торрент: " & nCount & " файлов" & auCRLF & T3 & auCRLF & _
"Режим: " & sMode & auCRLF & auCRLF & _
"Продолжить в режиме " & aMode[nMode+1] & "?", "Autorun", 3+64+0)
If EXTENDED = 6 Then Return FindTorrentParts(nMode+1)
Else
MsgBox("Найдено: " & c & auCRLF & auCRLF & _
"Торрент: " & nCount & " файлов" & auCRLF & T3 & auCRLF & _
"Режим: " & sMode, "Autorun", 64)
EndIf
Else
# проверка CapsLock
Local bCaps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
If gCapsReverse Then bCaps = Not bCaps
If bCaps Then
ShowRedHint("Автопереход к найденному")
GoToPathFromMsg(top1)
Return
EndIf
MsgBox("Найдено: " & c & auCRLF & auCRLF & sTop5 & auCRLF & _
"Торрент: " & nCount & " файлов" & auCRLF & T3 & auCRLF & _
"Режим: " & sMode & auCRLF & auCRLF & _
"Сохранить в текстовый файл?", "Autorun", 3+64+0)
If EXTENDED = 2 Then Return
If EXTENDED = 7 Then GoToPathFromMsg(top1)
If EXTENDED = 6 Then
Local txt
txt &= top1 & auCRLF & auCRLF
txt &= "-----------------" & auCRLF
txt &= "Top 5 locations:" & auCRLF
txt &= "-----------------" & auCRLF
txt &= sTop5 & auCRLF
txt &= "-----------------" & auCRLF
txt &= "Torrent files:" & auCRLF
txt &= "-----------------" & auCRLF
txt &= files & auCRLF & auCRLF
txt &= "-----------------" & auCRLF
txt &= "Full list:" & auCRLF
txt &= "-----------------" & auCRLF
txt &= sList
SaveDataPathToText(sFile, txt)
EndIf
EndIf
EndIf
EndFunc
Func TorrentFindOptions()
gTorrentDbg = Not gTorrentDbg
ShowRedHint("Торрент Debug " & (gTorrentDbg ? "включен" : "выключен"))
EndFunc
Func TorrentDebugInfo()
If Not gTorrentDbg Then gDbgStep = "Торрент Debug выключен"
If gDbgStep = "" Then gDbgStep = "Empty"
SetHintParam("ShowHint", "Font", 13, "Arial")
SetHintParam("ShowHint", "BackColor", 0x000000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint(gDbgStep)
WinAlign(LAST_HINT_WINDOW)
ClipPut(gDbgStep)
SetHintParam("ShowHint", "Reload")
EndFunc |
 Hidden text Code: | Func GetDPI()
Local DC = DllCall("GetDC", "int", 0)
Local lpy = DllCall("GetDeviceCaps", "handle", DC, "int", 88) # LOGPIXELSX
DllCall("ReleaseDC", "int", 0, "handle", DC)
Return lpy
EndFunc
Func Scale(nValue)
Static dpi = GetDPI()
Return DllCall("MulDiv", "int", nValue, "int", dpi, "int", 96)
EndFunc
Func ShowRedHint(HintText)
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint(HintText, "", "", 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(50)
SetHintParam("ShowHint", "Reload")
EndFunc |
|
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 900
|
(Separately) Posted: Sat Oct 04, 2025 13:35 Post subject: |
|
|
A55555
Я вчера неправильно написал про комбинации клавиш, но, возможно, вы разобрались, если было время попробовать.
Quote: | Теперь можно будет перед началом операции включить отладку (Alt+0), и когда зависнет Alt+Win+0. |
Все как раз наоборот. Alt+Win+0 включает режим отладки, Alt+0 выводит информацию на экран и копирует ее в буфер. Эти комбинации пришлось жестко прописать в модуль, потому что использование обычных em_команд не подходит для этих целей. Окно прогресса перехватывает фокус и em_команды не срабатывают, пока главное окно ТС не активно. Активировать его можно вручную, но это очень неудобно, поэтому нет смысла использовать интерфейс ТС для назначения горячих клавиш, как это делалось с предыдущими командами. Т.е. такая прописка в usercmd.ini и wincmd.ini не даст хорошего результата:
Code: | [em_torrent_data_options]
cmd=70506
[em_torrent_data_dbginfo]
cmd=70507 |
Code: | [Shortcuts]
A+0=em_torrent_data_dbginfo
[ShortcutsWin]
A+0=em_torrent_data_options |
Но саму кнопку с последней функцией можно так назначить, и она будет работать. Например Alt+N:
Code: | [em_torrent_data_name_size]
cmd=70504 |
Code: | [Shortcuts]
A+N=em_torrent_data_name_size
CA+N=em_torrent_data_name_size
SA+N=em_torrent_data_name_size |
Модификаторы Ctrl и Shift тоже будут работать.
Вчера не было времени об этом написать, но сейчас отвечу.
A55555 wrote: | В любом случае, даже вот так как сейчас, это просто супер. Спасибо. |
Ну тут и Loopback надо говорить огромное спасибо. Супер результат мог только случиться на супер плагинах TCTorrent и Autorun. Второй - это вообще нечто. Это движок без которого мы бы никуда не уехали. И если 10 лет назад на коротких штанцах можно было делать такое:
 Сборка TechAdmin Code: | # Enables Process functionality
LoadLibrary Plugins\Autorun_Process.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll
RegWrite "HKLM\SOFTWARE\TechAdmin" "Admin" "REG_DWORD" "1"
IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "1"
# Adding current TC path to PATH environment variable
# Добавляет к переменной окружения PATH текущую папку TC
SetEnv /A /EV PATH ;%COMMANDER_PATH%
SetEnv /EV COMMANDER_HANDLE %AUTORUN_TCHANDLE%
SetEnv /EV COMMANDER_PID %AUTORUN_TCPID%
# Установка архитектуры TC
SetEnv /EV COMMANDER_ARCH %AUTORUN_TCARCH%
# Проверка языка системы
StrUpper OSLANG %SYSINFO_USERLANG%
If %OSLANG% = ENU Then
SetEnv /EV COMMANDER_OSLANG Eng
Else
SetEnv /EV COMMANDER_OSLANG %OSLANG%
EndIf
# Проверка версии ОС
If %SYSINFO_OSVERSION% = WIN_XP Then
SetEnv COMMANDER_OSVER "XP"
ElseIf %SYSINFO_OSVERSION% = WIN_2003 Then
SetEnv COMMANDER_OSVER "2003"
ElseIf %SYSINFO_OSVERSION% = WIN_VISTA Then
SetEnv COMMANDER_OSVER "Vista"
ElseIf %SYSINFO_OSVERSION% = WIN_2008 Then
SetEnv COMMANDER_OSVER "2008"
ElseIf %SYSINFO_OSVERSION% = WIN_2008R2 Then
SetEnv COMMANDER_OSVER "2008R2"
ElseIf %SYSINFO_OSVERSION% = WIN_7 Then
SetEnv COMMANDER_OSVER "7"
ElseIf %SYSINFO_OSVERSION% = WIN_8 Then
SetEnv COMMANDER_OSVER "8"
ElseIf %SYSINFO_OSVERSION% = WIN_2012 Then
SetEnv COMMANDER_OSVER "2012"
Else
SetEnv COMMANDER_OSVER "Unknown"
EndIf
# Определение работы из PE
If %SYSTEMDRIVE% = X: Then
SetEnv COMMANDER_OSVER "PE"
EndIf
# Проверка архитектуры ОС
If %SYSINFO_OSARCH% = 64 Then
SetEnv COMMANDER_OSARCH x64
ElseIf %SYSINFO_OSARCH% = 32 Then
SetEnv COMMANDER_OSARCH x86
EndIf
# Проверка языкового файла TC
IniRead "Commander_LangIni" "%COMMANDER_INI%" "Configuration" "LanguageIni" ""
IniRead "Commander_LangAutoSwitch" "%COMMANDER_INI%" "Admin" "LanguageAutoSwitch" "0"
If (%COMMANDER_LANGINI% = wcmd_rus.lng) Then
SetEnv COMMANDER_LANG "Rus"
ElseIf (%COMMANDER_LANGINI% = wcmd_rus_PE.lng) Then
SetEnv COMMANDER_LANG "Rus"
SetEnv COMMANDER_OSVER "PE"
ElseIf (%COMMANDER_LANGINI% = wcmd_eng.lng) Then
SetEnv COMMANDER_LANG "Eng"
ElseIf (%COMMANDER_LANGINI% = wcmd_eng_PE.lng) Then
SetEnv COMMANDER_LANG "Eng"
SetEnv COMMANDER_OSVER "PE"
Else
SetEnv COMMANDER_LANG "Default"
EndIf
If (%COMMANDER_OSVER% = PE) AND (%COMMANDER_OSLANG% = RUS) AND (%COMMANDER_LANGINI% <> wcmd_rus_PE.lng) Then
SetEnv COMMANDER_LANG "Rus"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_rus_PE.lng"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_rus_PE.mnu"
SendCommand cm_LanguageConfig
ElseIf (%COMMANDER_OSVER% = PE) AND (%COMMANDER_OSLANG% = ENG) AND (%COMMANDER_LANGINI% <> wcmd_eng_PE.lng) Then
SetEnv COMMANDER_LANG "Rus"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_eng_PE.lng"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_eng_PE.mnu"
SendCommand cm_LanguageConfig
ElseIf (%COMMANDER_LANGAUTOSWITCH% <> 0) AND (%COMMANDER_OSLANG% = RUS) AND (%COMMANDER_LANG% <> Rus) Then
SetEnv COMMANDER_LANG "Rus"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_rus.lng"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_rus.mnu"
SendCommand cm_LanguageConfig
ElseIf (%COMMANDER_LANGAUTOSWITCH% <> 0) AND (%COMMANDER_OSLANG% <> %COMMANDER_LANG%) AND (%COMMANDER_OSLANG% <> RUS) Then
SetEnv COMMANDER_LANG "Eng"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_eng.lng"
IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_eng.mnu"
SendCommand cm_LanguageConfig
EndIf
# Определение первого запуска
IniRead COMMANDER_FIRSTSTART "%COMMANDER_INI%" "Admin" "FirstStart" "1"
If (%COMMANDER_FIRSTSTART% = 1) AND (%COMMANDER_OSLANG% <> %COMMANDER_LANG%) Then
SendCommand cm_LanguageConfig
ShellExec /EV /T '%COMMANDER_PATH%\Soft\NirSoft\WakeMeOnLan.exe' '/scan /UseNetBios 0' '%COMMANDER_PATH%\Soft\NirSoft'
EndIf
# Получение SID текущего пользователя
ProcessExecGetOutput /OEM USERSID cscript.exe '//Nologo "%commander_path%\Macroses\get_usersid.vbs"' '%commander_path%'
# Установка версии TC
SetEnv /EV COMMANDER_VER "8.52 - TechAdmin RC12 %COMMANDER_LANG% %COMMANDER_ARCH% bit (28.08.2015)"
# Проверка наличия прав Администратора
RegRead COMMANDER_ISADMIN "HKLM\SOFTWARE\TechAdmin" "Admin" "REG_DWORD" "0"
If (COMMANDER_OSVER = XP) AND (%AUTORUN_ISADMIN% = 1) Then
SetEnv /EV COMMANDER_ASADMIN "Admin"
ElseIf (COMMANDER_OSVER <> XP) AND (%AUTORUN_ISADMIN% = 1) AND (%COMMANDER_ISADMIN% = 1) Then
SetEnv /EV COMMANDER_ASADMIN "Admin"
RegWrite "HKLM\SOFTWARE\TechAdmin" "Admin" "REG_DWORD" "0"
Else
SetEnv /EV COMMANDER_ASADMIN "User"
EndIf
# Проверка наличия прав записи
IniRead COMMANDER_WRITEABLE "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "0"
If (%COMMANDER_WRITEABLE% = 1) Then
SetEnv /EV COMMANDER_SOFT "%COMMANDER_PATH%\Soft"
IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "0"
Else
SetEnv /EV COMMANDER_SOFT "%TEMP%\Soft"
IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "0"
EndIf
# Чтение параметров настройки
IniRead AskIfTCNotAsAdmin "%COMMANDER_INI%" "Admin" "AskIfTCNotAsAdmin" "1"
IniRead OnlyUserTCMode "%COMMANDER_INI%" "Admin" "OnlyUserTCMode" "0"
IniRead ShowHiddensOnStart "%COMMANDER_INI%" "Admin" "ShowHiddensOnStart" "1"
IniRead ShowTrayHint "%COMMANDER_INI%" "Admin" "ShowTrayHint" "1"
# Всплывающая подсказка при запуске TC
If %ShowTrayHint% = 0 Then
ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\autoexecmin~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
ElseIf %COMMANDER_ASADMIN% = Admin Then
ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\autoexecadm~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
Else
ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\autoexec~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
EndIf
# Запрос на запуск с правами Администратора
If %AskIfTCNotAsAdmin% = 0 Then
ElseIf %COMMANDER_ASADMIN% = User Then
ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\RunAsAdmin~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
EndIf
# Отображение всех скрытых окон TC при запуске новой копии TC с правами админа
If %ShowHiddensOnStart% = 0 Then
ElseIf %COMMANDER_ASADMIN% = Admin Then
ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "win show class TTOTAL_CMD"
EndIf
If %OnlyUserTCMode% = 1 Then
ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\UserTCMode~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
Set AskIfTCNotAsAdmin 0
Set ShowTrayHint 0
Set ShowHiddensOnStart 0
EndIf
# Настройки беспроводных сетей (Wi-Fi)
IniRead WLanProfile "%COMMANDER_PATH%\wincmd.ini" "WLan" "WLanProfile" ""
IniRead WLanImportProfile "%COMMANDER_PATH%\wincmd.ini" "WLan" "ImportProfileAtStart" "0"
IniRead WLanDeleteProfile "%COMMANDER_PATH%\wincmd.ini" "WLan" "DeleteProfileAtExit" "0"
If %WLanProfile% = "" Then
ElseIf %WLanImportProfile% = 1 Then
SetEnv /EV COMMANDER_WLAN "%WLanProfile%"
ShellExec /EV /SW_HIDE 'netsh.exe' 'wlan add profile filename="%commander_path%\Configs\WLan\%WLanProfile%.xml"'
Else
SetEnv /EV COMMANDER_WLAN "%WLanProfile%"
EndIf
# Функции для работы с оффлайн (отключенной) системой
IniRead OfflineSystemDir "%COMMANDER_PATH%\wincmd.ini" "OFFLINESYSTEM" "OfflineSystemDir" "C:\Windows"
If %OfflineSystemDir% = "" Then
SetEnv COMMANDER_OFFLINESYSTEM "C:\Windows"
Else
SetEnv /EV COMMANDER_OFFLINESYSTEM "%OfflineSystemDir%"
EndIf
# Автоматически сканировать сеть и получать MAC-адреса локальных компьютеров
IniRead RefreshLanMACsOnStart "%COMMANDER_PATH%\wincmd.ini" "Admin" "AutoRefreshLanMACs" "1"
If (%RefreshLanMACsOnStart% = 1) AND (%COMMANDER_FIRSTSTART% <> 1) Then
ShellExec /EV /SW_HIDE '%COMSPEC%' '/c del WakeMeOnLan.cfg /f /q' '%COMMANDER_PATH%\Soft\NirSoft'
ShellExec /EV /T '%COMMANDER_PATH%\Soft\NirSoft\WakeMeOnLan.exe' '/scan' '%COMMANDER_PATH%\Soft\NirSoft'
EndIf
# Создание переменной содержащей SID текущего пользователя
SetEnv /EV COMMANDER_USERSID "%USERSID%"
# Расшифровывать Admin.ini при запуске TC
IniRead EncryptAdminINI "%COMMANDER_PATH%\wincmd.ini" "Admin" "EncryptAdminINI" "0"
IniRead EncryptAdminINI_SID "%COMMANDER_PATH%\wincmd.ini" "Admin" "EncryptAdminINIWithSID" "0"
If %EncryptAdminINI% = 0 Then
ElseIf %EncryptAdminINI_SID% = 1 Then
ShellExec /EV /WAIT /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-d -v -r -s -K "%COMMANDER_USERSID%" "%commander_path%\Admin.ini"'
Else
ShellExec /EV /WAIT /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-d -v -r -s -K "%USERNAME%" "%commander_path%\Admin.ini"'
EndIf
# Проверка включения функции удаленного администрирования
IniRead RemoteAdminEnable "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminEnable" "0"
# Установка пароля и имени пользователя для удаленного администрирования
If %RemoteAdminEnable% = 1 Then
IniRead RemoteAdminName "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminName" "Администратор"
IniRead RemoteAdminPWD "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminPwd" "0"
IniRead RemoteAdminSys "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteSystems" "%commander_path%\Admin.lst"
IniRead RemoteDomain "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteDomain" ""
IniRead RemoteListRefreshAtStart "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RefreshAdminListAtStart" "0"
IniRead RemoteDefaultUseAdminList "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "DefaultUseAdminList" "1"
SetEnv /EV COMMANDER_ADMINNAME "%RemoteAdminName%"
SetEnv /EV COMMANDER_ADMINPWD "%RemoteAdminPwd%"
SetEnv /EV COMMANDER_ADMINSYSTEMS "%RemoteAdminSys%"
EndIf
# Использовать по умолчанию список из Admin.lst
If %RemoteDefaultUseAdminList% = 1 Then
SetEnv /EV COMMANDER_ADMINSYSTEMS "%COMMANDER_PATH%\Admin.lst"
EndIf
If %RemoteListRefreshAtStart% = 1 Then
ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "execmd NET VIEW | FINDSTR ~q\\~q > ~q~$sys.COMMANDER_PATH$\Admin.lst~q"
EndIf
# Шаблоны переименования
IniRead RENAMETEMPLATE1 "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate1" "шаблон1"
IniRead RENAMETEMPLATE2 "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate2" "шаблон2"
IniRead RENAMETEMPLATE3 "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate3" "шаблон3"
SetEnv /EV COMMANDER_RENAMETEMPLATE1 "%RENAMETEMPLATE1%"
SetEnv /EV COMMANDER_RENAMETEMPLATE2 "%RENAMETEMPLATE2%"
SetEnv /EV COMMANDER_RENAMETEMPLATE3 "%RENAMETEMPLATE3%"
IniRead SaveTemplateSettings "%COMMANDER_INI%" "Admin" "SaveTemplateSettings" "0"
IniRead RUNASDATE "%COMMANDER_PATH%\wincmd.ini" "Admin" "RunAsDate" "01\12\1991"
SetEnv /EV COMMANDER_RUNASDATE "%RUNASDATE%"
# After this line all actions are performed when TC closing
# После этой строки все действия выполняются при закрытии TC
Pragma AutorunFinalizeSection
# Шифрование Admin.ini
If %EncryptAdminINI% = 0 Then
ElseIf %EncryptAdminINI_SID% = 1 Then
ShellExec /EV /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-e -v -r -s -K "%COMMANDER_USERSID%" "%commander_path%\Admin.ini"'
Else
ShellExec /EV /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-e -v -r -s -K "%USERNAME%" "%commander_path%\Admin.ini"'
EndIf
# Удаление профиля беспроводной сети
If %WLanProfile% <> "" Then
ShellExec /EV /SW_HIDE 'netsh.exe' 'wlan delete profile name="%WLanProfile%"'
EndIf
# Сохранение временных настроек
If %SaveTemplateSettings% = 1 Then
IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate1" "%COMMANDER_RENAMETEMPLATE1%"
IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate2" "%COMMANDER_RENAMETEMPLATE2%"
IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate3" "%COMMANDER_RENAMETEMPLATE3%"
IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "OFFLINESYSTEM" "OfflineSystemDir" "%COMMANDER_OFFLINESYSTEM%"
IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminName" "%COMMANDER_ADMINNAME%"
IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminPwd" "%COMMANDER_ADMINPWD%"
IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteSystems" "%COMMANDER_ADMINSYSTEMS%"
IniWrite /EV "%COMMANDER_INI%" "WLan" "WLanProfile" "%COMMANDER_WLAN%"
EndIf
# Удаление списка MAC-адресов машин
If %RefreshLanMACsOnStart% = 1 Then
ShellExec /EV /SW_HIDE '%COMSPEC%' '/c del WakeMeOnLan.cfg /f /q' '%COMMANDER_PATH%\Soft\NirSoft'
EndIf
If %COMMANDER_FIRSTSTART% = 1 Then
IniWrite /EV "%COMMANDER_INI%" "Admin" "FirstStart" "0"
EndIf |
То сейчас о чем говорить? )
 Hidden text |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 63
|
(Separately) Posted: Sat Oct 04, 2025 23:35 Post subject: |
|
|
Orion9 wrote: | A55555
Я вчера неправильно написал про комбинации клавиш, но, возможно, вы разобрались, если было время попробовать.
Quote: | Теперь можно будет перед началом операции включить отладку (Alt+0), и когда зависнет Alt+Win+0. |
Все как раз наоборот. Alt+Win+0 включает режим отладки, Alt+0 выводит информацию на экран и копирует ее в буфер. |
Orion9
спасибо, всё работает как вы сказали.
Спасибо за опции удобной настройки.
Alt+Win+0 достаточно один раз в данной копии TC активировать и для всех торрент-поисков через 70504 в рамках данной копии TC оно будет мониторить?
Orion9 wrote: | А зачем вам запускать и выгружать Everything в каждой операции? |
Просто максимум возможной автоматизации.
Прикладываю скрин, на 88% остановилось
 Hidden text
перед этим на 98% было, хаотично в общем продолжает место остановки случаться.
Orion9 wrote: | В клиенте есть опция для полного распределения дискового пространства для новой раздачи сразу после ее старта. На бумаге должно работать, но надо проверять. Могут быть нюансы. |
Указал в клиенте и теперь все виды поиска находят едва начавшийся качаться файл.
Но попробовал и до установки опции в торрент-клиенте, поиск 70504 предложение выкинул попробовать поискать через "Название" и нашло.
Появился не стабильно случающийся баг, нашло, написало Автопереход, но противоположную панель не обновило визуально.
Ничего не сдвинулось никуда на противоположной панели, не выделило файл или папку, плюс при попытке на этой противоположной панели что-то сделать она не выполняет то что ты от неё хочешь, например зайти внутрь какой-то случайной папки. Не прям висит, но отказывается правильно работать.
Нужно свернуть и развернуть окно TC (вручную т.е. сделать визуальное обновление) и получаешь правильного вида противоположную панель с выделенным найденным файлом или папкой.
Не только 70504, через 70501 тоже такое случается. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 900
|
(Separately) Posted: Sun Oct 05, 2025 00:33 Post subject: |
|
|
A55555 wrote: | Alt+Win+0 достаточно один раз в данной копии TC активировать и для всех торрент-поисков через 70504 в рамках данной копии TC оно будет мониторить? |
Да. При этом в заголовок рядом с процентами будет добавлена информация по памяти. Толку от этой информации никакой, но зато видно, что включен режим отладки. Сегодня утром запустил на торренте с 10000 файлами в режиме "только размер", долго пришлось ждать - два сообщения успел на форум запостить - но ничего не зависло и дошло до конца с 55 Мб памяти. Так что памяти не должно много расходоваться, даже если будут найдены десятки тысяч файлов и путей. Проблема в другом.
У вас на скрине видно, что зависло на третьем шаге, т.е. на функции FileFindEv, которая запрашивает данные у Everything. Как я и думал, проблема именно в этом, и мне тоже удалось ее повторить. В первом случае зависло на 5%, во втором на 23%
Code: | Step 1. TorrentGet j=516
Step 2. WinSetText Components\2k10\Programs-2k10\Games\cards.dll
Step 3. FileFindEv Components\2k10\Programs-2k10\Games\cards.dll |
Code: | Step 1. TorrentGet j=2272
Step 2. WinSetText Components\2k10\User.Win\Win-XP\XPpSP3\I386\LEGITCC.DL_
Step 3. FileFindEv Components\2k10\User.Win\Win-XP\XPpSP3\I386\LEGITCC.DL_ |
Но важный момент. К зависаниям больше или только склонен ТСх64, в ТСх86 мне не удается добиться зависаний на разных торрентах, включаяя и тот, что с 10000 файлами.
В общем, с такой проблемой нужно обращаться к Loopback. Может быть он найдет причину, почему FileFindEv виснет, и починит, если это вообще возможно. А может и не возможно.
A55555 wrote: | Не только 70504, через 70501 тоже такое случается. |
Эту я проблему совсем не понял, у меня такого вроде нет. Но могу предположить, что переход происходит медленно и команда перехода (CommandExec /CD %'file') просто не успевает доработать до конца. Такое может случиться, например, если переход осуществляется в архив, т.е. курсор ставится не на файл архива, а происходит заход именно в архив, поэтому так долго. А может просто зависает где чего, как в случаее с Everything. Попробуйте в 32-битном ТС, будет такая проблема повторяться или нет. |
|
Back to top |
|
 |
yozhik

Joined: 04 May 2014 Posts: 308 Location: Электросталь
|
(Separately) Posted: Sun Oct 05, 2025 02:27 Post subject: |
|
|
Loopback
Quote: | Runtime error 216 at 06CC22E7 |
Это у меня стабильно происходит с 32-битным TC когда RegExpReplace вызывается 51 раз подряд.  Вот кусок кода: Code: | # WinMerge Light
FC = FileRead(COMMANDER_PATH & '\Profile\tools\WINMERGE\WinMerge.ini', 0, 'ANSI')
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Bold07)=.+$', '$1=1', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color01)=.+$', '$1=16777215', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color02)=.+$', '$1=16777215', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color03)=.+$', '$1=0', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color04)=.+$', '$1=15790320', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color05)=.+$', '$1=14120960', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color06)=.+$', '$1=16777215', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color07)=.+$', '$1=16711680', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color08)=.+$', '$1=8388736', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color09)=.+$', '$1=32768', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color10)=.+$', '$1=255', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color11)=.+$', '$1=6316128', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color12)=.+$', '$1=128', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color13)=.+$', '$1=12615680', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color20)=.+$', '$1=8388608', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color21)=.+$', '$1=12615680', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color22)=.+$', '$1=8388607', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color23)=.+$', '$1=8388479', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color24)=.+$', '$1=8355839', 1)
FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color25)=.+$', '$1=16744319', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DefaultTextColoring)=.+$', '$1=1', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DifferenceColor)=.+$', '$1=14548957', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DifferenceDeletedColor)=.+$', '$1=16769248', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemDiffColor)=.+$', '$1=14548957', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemDiffTextColor)=.+$', '$1=0', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemEqualColor)=.+$', '$1=16777215', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemEqualTextColor)=.+$', '$1=0', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemFilteredColor)=.+$', '$1=14153210', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemFilteredTextColor)=.+$', '$1=0', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemNotExistAllColor)=.+$', '$1=16769248', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemNotExistAllTextColor)=.+$', '$1=0', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/DirMarginColor)=.+$', '$1=16777215', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/MovedBlockColor)=.+$', '$1=12638448', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/MovedBlockDeletedColor)=.+$', '$1=12632256', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SNPColor)=.+$', '$1=14678779', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SNPDeletedColor)=.+$', '$1=15329769', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedDifferenceColor)=.+$', '$1=14540287', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedDifferenceDeletedColor)=.+$', '$1=12632304', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedMovedBlockColor)=.+$', '$1=5140728', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedMovedBlockDeletedColor)=.+$', '$1=10728956', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedSNPColor)=.+$', '$1=11843567', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedSNPDeletedColor)=.+$', '$1=14737648', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedWordDifferenceColor)=.+$', '$1=11184895', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedWordDifferenceDeletedColor)=.+$', '$1=9213670', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/TrivialDifferenceColor)=.+$', '$1=12579579', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/TrivialDifferenceDeletedColor)=.+$', '$1=15329769', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/WordDifferenceColor)=.+$', '$1=11206570', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/WordDifferenceDeletedColor)=.+$', '$1=10544800', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SysColorHookEnabled)=.+$', '$1=0', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/ColorScheme)=.+$', '$1=Modern', 1)
FC = RegExpReplace(FC, '(?m-s)^(Settings/SysColorHookColors)=.+$', '$1=2:0x00d1b499,3:0x00dbcdbf,5:0x00ffffff,8:0x00000000,9:0x00000000,12:0x00ababab,13:0x00d77800,14:0x00ffffff,15:0x00f0f0f0,16:0x00a0a0a0,17:0x006d6d6d,18:0x00000000,19:0x00000000,20:0x00ffffff,21:0x00696969,27:0x00ead1b9,28:0x00f2e4d7', 1)
FileWrite(COMMANDER_PATH & '\Profile\tools\WINMERGE\WinMerge.ini', FC, 'ANSI') |
Закомментирую этот кусок — нет Runtime error. Раскомментирую — получите, распишитесь. На 64-битном TC этого нет. Только на х32. После перезагрузки компьютера запускаю TC — сбой не происходит, затем пара перезапусков проходят гладко. Но стоит TC постоять открытым некоторое время и тогда при перезапусках начинает появляться Runtime error. _________________ Amo ergo sum |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1628
|
(Separately) Posted: Sun Oct 05, 2025 11:25 Post subject: |
|
|
yozhik wrote: | Это у меня стабильно происходит с 32-битным TC когда RegExpReplace вызывается 51 раз подряд. |
А на предыдущей версии то же самое проявляется? Или только на последней?
И еще, хорошо бы для теста сам файл WinMerge.ini.
yozhik wrote: | тогда при перезапусках |
При перезапусках тотала?
Orion9 wrote: | Может быть он найдет причину, почему FileFindEv виснет |
В таком виде это слишком сложно для повторения, нужно что-то более короткое, где проблема функции (если это проблема в ней) сможет проявиться. У меня просто нет массивов блюреев, я их вообще не качаю, и торренты долго не храню.
Впрочем, есть одно предположение. Не может ли быть такого, что список файлов FileFindEv получает дольше 5 секунд? Просто сейчас стоит жёстко заданный таймаут, после этого операция прерывается. Этот момент уже отметил для себя в процессе ревизии кода, таймаут сделаю настраиваемым, но пока вот так. |
|
Back to top |
|
 |
yozhik

Joined: 04 May 2014 Posts: 308 Location: Электросталь
|
(Separately) Posted: Sun Oct 05, 2025 12:23 Post subject: |
|
|
Loopback wrote: | А на предыдущей версии то же самое проявляется? Или только на последней? |
Воспроизводится на 2.2.20.0, т.е. с момента появления RegExp.dll. Вчера также воспроизвёл на 2.2.20.3 и 2.2.21.0. Сейчас у меня 2.2.21.1. А раньше я не сигнализировал по 2м причинам: 1) этот кусок обработки WinMerge.ini я написал всего несколько дней назад; 2) у меня Windows на виртуалке, и потому я приучил себя не рефлексировать легко на сбои, а перепроверять на случай, если причина сбоя не в Винде, а в виртуализации, хотя вообще этот конкретный механизм (Parallels) — очень качественный.
Loopback wrote: | сам файл WinMerge.ini |
https://send.vis.ee/download/00d7e31e23a70a58/#5oMy43R6bMyQjk9-W6PADg
WinMerge.ini, autorun.aucfg и кнопка.
Loopback wrote: | При перезапусках тотала? |
Да. Я так себе настроил, что между тёмной и светлой темами переключаюсь перезагрузкой Тотала ("cm_SwitchDarkmode, cm_exit 25"), во время которой перезаписываются все *.ini wd-плагинов и сторонних утилит. (Можно, конечно, настроить переключение и без перезагрузки Тотала, но пока руки не дошли.) Я, собственно, для этого и свой aucfg прикрепил (вместе с кнопкой перезапуска), чтобы Вы могли глянуть, если понадобится, для чего вообще эти перезапуски.
Добавлено:
См. ниже пост: кажется разобрался. _________________ Amo ergo sum
Last edited by yozhik on Sun Oct 05, 2025 19:54; edited 1 time in total |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 900
|
(Separately) Posted: Sun Oct 05, 2025 13:29 Post subject: |
|
|
A55555 wrote: | Просто максимум возможной автоматизации. |
Но тогда получается, что если вы хотите найти 10 торрентов, то Everything будет запускаться и выгружаться 10 раз.
Мне проще один раз запустить вручную и видеть значок в трее. Когда утилита больше не нужна, выгрузить ее по Ctrl+Alt+E. Или другую комбинацию для этого назначить.
A55555 wrote: | Появился не стабильно случающийся баг, нашло, написало Автопереход, но противоположную панель не обновило визуально. |
Сейчас на свежую голову больше понимаю о чем речь, но проблему воспроизвести не удалось. Похоже, ТС просто не обновляет окно, не перерисовывает его. Надеялся в 64-версии поймать эту проблему (ТСх64 известем такими неприятными косяками), но не смог. А главное зависаний больше никаких не было, не смотря на то, что я с полчаса гонял различные торрент-файлы.
Ну, с зависаниями еще могу объяснить. Отключил в настройках Everything индексацию томов с установленными системами, теперь поиск просто летает. Bluray с 1200 файлами проходит буквально на глазах. Про сотню файлов и меньше и говорить нечего - операция длится всего пару секунд. Кроме того сегодня тестировал на спокойной системе (ничего в фоне не качалось, не игралось, не сжималось и вообще не делалось), отсюда, вероятно, такой хороший и стабильный результат, т.е. без каких-либо зависаний.
A55555
Сейчас у меня не будет времени на Autorun, но если вы и дальше будете пользоваться, фиксируйте косяки и баги, а также где и что можно улучшить. Надеюсь, доберусь до всего со временем.
Loopback wrote: | У меня просто нет массивов блюреев, я их вообще не качаю, и торренты долго не храню. |
Наличие самих данных, конечно, желательно, но для тестов не требуется. Можно просто взять торрент-файл от Bluray диска, например тот, который упоминал A55555, или любой другой. Ссылку на файл с 10000 файлами я тоже постил на предыдущей странице.
Loopback wrote: | Не может ли быть такого, что список файлов FileFindEv получает дольше 5 секунд? Просто сейчас стоит жёстко заданный таймаут, после этого операция прерывается. |
Даже не знаю. 5 секунд вроде нормально, но многое ведь может зависить от загруженности процессора в конкретный момент и количества файлов в базе Everything. Может и в самой Everything есть какой-то баг. Но в любом случае если долго нет ответа, FileFindEv должна это обрабатывать и возвращать результат. Сейчас похоже она просто висит и ждет данных на свой запрос. Хотя нужно еще обратить внимание, что в строке вызова присутствует объект List со свойством текст
Code: | aQuery.Text = FileFindEv('*\"' & sRes & '" size:' & sSize, "", "") |
Может в нем причина? |
|
Back to top |
|
 |
yozhik

Joined: 04 May 2014 Posts: 308 Location: Электросталь
|
(Separately) Posted: Sun Oct 05, 2025 19:49 Post subject: |
|
|
Loopback
Ох, наконец-то у меня получилось, кажется, разобраться! Методом научного тыка столько всего перепробовал — и кол-во вызовов RegExpReplace, и замену RegExpReplace на StrReplace (без регулярок, конечно, но опять выскакивал Runtime error), и длину строк в частях <что_найти> и <чем_заменить>. А оказалось то что? Переменные. В своём aucfg я для манипуляций с содержимым файла использую переменную FC (от File Content) — в неё читаю, в ней меняю, из неё записываю. И она у меня там в двух блоках, т.е. в общей сложности 15 + 51 = 66 обращений — 66 перезаписей содержимого. Заменил в одном блоке на другую переменную, другое имя — всё, с того момента Runtime error прекратились. _________________ Amo ergo sum |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1628
|
(Separately) Posted: Sun Oct 05, 2025 23:26 Post subject: |
|
|
yozhik
Сдается мне, что это все-таки не решение проблемы и она где-то глубже. Многократное использование переменных не должно приводить к падению, даже при обращении к ним из разных потоков. Я все же попробую код, может и повторится. И функции тоже проверить стоит, хотя я их в цикле гонял по нескольку тысяч раз (для измерения скорости), но там в тесте был только один регэксп.
Во всяком случае вроде ясно, что это не связано с последними внутренними изменениями в работе с параметрами, спасибо за проверку.
Orion9 wrote: | Но в любом случае если долго нет ответа, FileFindEv должна это обрабатывать и возвращать результат. |
Для этого и сделан таймаут, но он, конечно, должен настраиваться.
Orion9 wrote: | Сейчас похоже она просто висит и ждет данных на свой запрос. |
Это можно попробовать проверить, включив функцию обратного вызова и из нее выводить результат куда-нибудь. Можно и в OutputDebgString, но она прилично замедляет работу, с ней легко можно и не уложиться в 5 секунд.
Orion9 wrote: | присутствует объект List со свойством текст |
Он получит текст только после завершения FileFindEv. Но нельзя исключать и его. Чтобы проверить, можно попробовать вывести не в список, а в файл.
Но вообще, код FileFindEv еще глубоко не проверял, может там и так что-то очевидное найдется. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 900
|
(Separately) Posted: Mon Oct 06, 2025 00:29 Post subject: |
|
|
Loopback wrote: | Это можно попробовать проверить, включив функцию обратного вызова и из нее выводить результат куда-нибудь. |
Loopback wrote: | Чтобы проверить, можно попробовать вывести не в список, а в файл. |
Хорошие идеи, но нет возможности проверить. Зашел только, чтобы о перерисовке написать.
A55555
Если проблема, которую вы описали, будет повторяться, замените функцию GoToPathFromMsg на эту:
 Hidden text Code: | Func GoToPathFromMsg(Target)
If FileExist(Target) Then
If RequestInfo(1000) = 2 Then
CommandExec /CD %'Target'
Else
CommandExec /CD '' %'Target'
Endif
SendCommand(4006)
If StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
WinRedraw(1)
SendCommand(540) # cm_RereadSource
Else
ShowHint("Путь не существует " & Target)
EndIf
EndFunc
|
Здесь я добавил всего две строчки: WinRedraw(1) и SendCommand(540). Первая перерисовывает окно, вторая перечитывает панель. Если проблема уйдет, одну из этих команд можно убрать. Вполне возможно, что и на одной команде будет работать. |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 63
|
(Separately) Posted: Mon Oct 06, 2025 00:39 Post subject: |
|
|
Orion9 wrote: | A55555
Сейчас у меня не будет времени на Autorun, но если вы и дальше будете пользоваться, фиксируйте косяки и баги, а также где и что можно улучшить. Надеюсь, доберусь до всего со временем.
|
Orion9
да, я сразу напишу.
Пока, не считая на Blu-Ray подвисаний, только вот это частенько случающееся именно после последней версии Torrent.aucfg не обновление противоположной панели, при том что сам поиск успешен.
При чём когда это происходит (не обновление противоположной панели), не выполняется даже команда SendCommand(2002), т.е. вручную при помощи свернул/развернул окно TC обновляешь и оказываешься внутри папки искомой папки торрент файла, т.е. оно не смогло из-за этого "НЕобновления" проделать этот момент SendCommand(2002).
Когда, для этого же торрента, благополучно проходит обновление противоположной панели, то и SendCommand(2002) нормально выполняется, выделенной оказывается главная папка с именем торрента.
Толи фокус на главное окно TC не успевает через раз вернуться, не понятно.
Для ручного обновления достаточно также просто нажать на букву диска в панели выбора дисков TC.
Костыль, куда-то с повторной командой обновить панель или перерисовать окно TC временно может можно соорудить в конце 70501 и 70504?
Это НЕобновление панели у меня точно при отключенном dbg, проверю еще если активировать его как будет. Если и с ним проблема, откачусь на предыдущую версию, там про эту проблему и не знал. Потому как по-крайней мере с неактивированным dbg это у меня происходит минимум в 50% случаев поиска. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|