Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page Previous  1, 2, 3 ... 229, 230, 231
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Orion9



Joined: 01 Jan 2024
Posts: 1093

Post (Separately) Posted: Fri May 08, 2026 00:31    Post subject: Reply with quote

AkulaBig
Как-то я забыл, что есть вариант с DllCall. Можно заменить ShellExec на
Code:
DllCall("kernel32.dll\DeleteFileW", "Wstr", gExifOut)

И вот так, кажись, лучше стало. Но "дичь" все-равно творится. Думаю, есть какая-то глубокая проблема в самом Autorun. Как-то он неповоротливо работает с наборами колонок. Не зря вы писали, что WinScriptAdv может дать ему фору. Скорее всего без пояснений от автора не обойтись.

Можно еще попробовать писать в файл через DllCall вместо объекта BinaryFile. Есть у меня подозрения, что этот объект тоже медленно разворачивается. Изначально хотел через FileWrite делать, но оказалось, что эта функция не может записать в файл аргументов (gExifArgs) из-за ошибки доступа, поэтому и пришлось использовать BinaryFile с опцией "a". Еще одна проблема Loopback на заметку. Но ведь можно и через DllCall попробовать, ничто вроде не мешает. Правда придется с параметрами разбираться, чтобы не словить ту же ошибку, что и FileWrite. Пример с такой записью у меня остался, но его придется адаптировать, наверное

 Hidden text

Возможно, это поднимет скорость, но мне кажется, если делать всерьез, то лучше, наверное, через WinScriptAdv - Autorun пока не показывает надежности.
AkulaBig wrote:
Файл очищается с помощью команды break. Не знал о таком ее применении.

Тоже не знал. Может просто болванится? Я не проверял )
AkulaBig wrote:
Интересно, чтобы -execute сработало файл именно удалять нужно? А может достаточно изменения?

Да можно, конечно. Просто удаление файла гарантирует, что в новом файле будут актуальные данные. Если не удалять, где гарантии, что все будет записываться правильно. Это нужно как-то проверять.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 547

Post (Separately) Posted: Fri May 08, 2026 07:11    Post subject: Reply with quote

Orion9 wrote:
Как-то я забыл, что есть вариант с DllCall.

Я с утра тоже об этом подумал.
Orion9 wrote:
Можно еще попробовать писать в файл через DllCall вместо объекта BinaryFile.

А вот про это не знал. Нигде до этого не приходилось этот объект использовать.
Orion9 wrote:
если делать всерьез, то лучше, наверное, через WinScriptAdv - Autorun пока не показывает надежности.

У меня это уже сделано в рабочей сборке. Другое дело, что скорость работы ET и там хочется увеличить, но работает. Еще надо учитывать, что скорость обработки разных расширений разная. djvu, pdf тяжелые. То-есть вы сейчас можете мне выложить скорость обработки 100 doc, которая будет в 10 раз меньше скорости обработки двух pdf.
Orion9 wrote:
Это нужно как-то проверять.

Проверю. Это самое простое на данный момент.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 547

Post (Separately) Posted: Fri May 08, 2026 11:18    Post subject: Reply with quote

В общем вот полностью рабочее решение:
Code:

Func ET(FileName, FieldIndex, UnitIndex)
   If StrPos(FileGetAttr(FileName), "D") Then Return

   Local ExifToolPID = 0, ExifToolOut = TEMP & "\exiftool_out.txt", ExifToolArgs = TEMP & "\exiftool_args.txt"

   ExifToolPID = ProcessGetId("exiftool.exe")
   If ExifToolPID = 0 Then
      FileWrite(ExifToolArgs, "", "UTF-8 NOBOM")
      ShellExec /TT /SW_HIDE %util_ET% "-stay_open True -@ ""%ExifToolArgs%"""
   EndIf

   ShellExec /SW_HIDE /WAIT %COMSPEC% "/c break > ""%ExifToolOut%"""

   Local sArgs = "-f" & auCRLF & _
      "-s3" & auCRLF & _
      "-m" & auCRLF & _
      "-q" & auCRLF & _
      "-q" & auCRLF & _
      "-Title" & auCRLF & _
      "-W+!" & auCRLF & _
      ExifToolOut & auCRLF & FileName & auCRLF & "-execute" & auCRLF

   Local obj = BinaryFile(ExifToolArgs, "a")
   obj.WriteStr(sArgs, "", "UTF-8")
   Free(obj)

   # ждем, пока ExifTool создаст файл (цикл ожидания)
   Local WaitCount = 0
   While Not FileExist("%ExifToolOut%")
      Sleep 50
      WaitCount = WaitCount + 1
      ansi = FileRead(ExifToolOut)
      if WaitCount > 50 then Break
   Wend

   Return ansi
EndFunc

Никакого интереса оно не представляет. Я и без -stay_open так могу. Зато теперь все понятно. Проблема Ауторан в том, что он почему-то выводит данные не для каждого файла, а для всех сразу. Поэтому идет задержка для всех файлов, а потом данные выводятся мгновенно.
Время ожидания задается кодом ожидания. Если его убрать, данные выводятся сразу, но пустыми. Пришлось поставить 2,5 сек, чтобы все данные прочитались. Ну и обратите внимание на мелочи. /WAIT ставить обязательно. Оно никак не влияет на первоначальную задержку. Break отлично работает. Нет файла, создает его. Есть файл, очищает его. Преимущество в том, что не надо делать проверку и код сокращается до одной строки.
Осталось только проверить работу с au3. Вдруг там что-то -stay_open изменит.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1093

Post (Separately) Posted: Fri May 08, 2026 13:01    Post subject: Reply with quote

AkulaBig
Вчера небольшую фигню написал.

Ошибка с доступом была не с FileWrite, а с FileAppend: именно эта функция предназначена для записи в конец файла, но через нее не удалось решить. Вероятно, есть какая-то проблема с правами, через BinaryFile получается же. В общем, это остается Loopback на заметку. Хотя если он вернётся, первым партийным заданием для него будет научить нейросеть работать с Autorun Very Happy Тогда код можно будет тянуть, как с конвеера ) Возможно, этот код не будет полностью рабочим, но в качестве заготовок сойдет.

Сейчас для Autohotkey эта схема работает идеально. Достаточно просто спростить, и будет ответ:

 Hidden text

А вот если бы он сразу выдавал готовый код, насколько это облегчило бы жизнь

 Hidden text

Я хотел было доделать этот пример до конца, но потом понял, что для работы с файлом ExifTool строку для записи надо еще в UTF-8 переводить. А объект BinaryFile сам это делает. В общем, решил в итоге перевести его в статик, чтобы он не создавался при каждом вызове, это должно немного поднять скорость. Сейчас весь фрагмент, очищенный от комментариев, выглядит так
Code:
If FileExist(gExifOut) Then
   DllCall("kernel32.dll\DeleteFileW", "Wstr", gExifOut)
EndIf
Local sArgs = "-G0"   & auCRLF & _           
              "-lang" & auCRLF & _
              "ru"    & auCRLF & _                     
              "-W+!"  & auCRLF & gExifOut & auCRLF & FileName & auCRLF & "-execute" & auCRLF       
Static obj = BinaryFile(gExifArgs, "a")   
obj.WriteStr(sArgs, "", "UTF-8")
ansi = "<time-out>"
For i = 1 To 50
    If FileExist(gExifOut) Then
       ansi = FileRead(gExifOut, 0, "UTF-8")
       DllCall("kernel32.dll\DeleteFileW", "Wstr", gExifOut)
       Break
    EndIf
    Sleep(20)
Next
Return ansi

Работает значительно лучше и стабильнее, но все-равно могут прошмыгивать пустые позиции, хоть и мало.

AkulaBig wrote:
Зато теперь все понятно. Проблема Ауторан в том, что он почему-то выводит данные не для каждого файла, а для всех сразу.

Причем это характерно только для 64-битной версии, в 32-битной такого нет. Об этом я в свое время писал Loopback, но он тогда не ответил. Кроме того, в обеих версиях при прокрутке панели ползунком повляются белые прямоугольные артефакты и начинается какая-та "дичь". В общем, есть проблемы. Очень всё сыро выглядит.
AkulaBig wrote:
Break отлично работает. Нет файла, создает его. Есть файл, очищает его.

Хех. Не подвёл болван!
AkulaBig wrote:
Осталось только проверить работу с au3. Вдруг там что-то -stay_open изменит.

Изменит однозначно. Но я бы vbs не скидывал со счетов. И сильно по поводу отключения VBScript на некоторых машинах не парился. На таких компах и сборкам делать нечего.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 547

Post (Separately) Posted: Fri May 08, 2026 16:27    Post subject: Reply with quote

Orion9 wrote:
Причем это характерно только для 64-битной версии, в 32-битной такого нет.

Ах тыж, блин. А я столько времени потратил на попытку сделать код в Ауторан. В этом и есть вся причина. Попробовал в х32. Работает не хуже, чем на au3. Ну тогда вообще нет никакого смысла что-то городить. Понятно, что пока сансей не исправит глюк, про Ауторан можно забыть. Вот отлично работающий в х32 код, без всяких -stay_open:
Code:

Func ET1(FileName, FieldIndex, UnitIndex)
   Local pipe
   If StrPos(FileGetAttr(FileName), "D") Then Return
   ProcessExecGetOutput pipe %util_ET% '-T -m -q -q -Title "%FileName%"'
   If Not StrPos(pipe, "Error:") Then Return FixCPET(pipe)
EndFunc

Func ET(FileName, FieldIndex, UnitIndex)
   If StrPos(FileGetAttr(FileName), "D") Then Return

    Static a = List(), u = List()
    Local ansi, utf8, wrong = Chr(0xFFFD)

   Local param = " -f -s3 -m -q -q -Title "
   ClipPut("")

ShellExec("~/SW_HIDE /WAIT", COMSPEC, '/c ' & util_ET & param & '"' & FileName & '"' & ' | clip')

   ansi = ClipGet()
   ClipPut("")
   If Not StrPos(pipe, "Error:") Then Return FixCPET(pipe)
EndFunc

Единственное, огромная просьба к вам. Сами понимаете, в буфер приходит OEM. То-есть FixCPET(pipe) сначала надо из 866 перекодировать в 1251, а затем в утф. На au3 я это реализовал. Ниже увидите в коде. Можете помочь сделать это в Ауторан? Хочется закончить этот код. Пусть он будет не рабочий пока, но вдруг пригодится. Конечно я пока не буду писать код разделения значений полей. Но хочу чтобы база была сделана.
Orion9 wrote:
Изменит однозначно.

На данный момент я решил отказаться от реализации этой идеи. Очень мне не нравится, что все держится на wait. Мне кажется тогда надо ожидание выполнять не через временные интервалы, а через сравнение значений. Иначе это какая-то чудовищная потери скорости. Ладно, решу, тестить или не тестить.
Orion9 wrote:
Но я бы vbs не скидывал со счетов.

Ха, ха, ха. А я его не скинул со счетов. Я вам намекал на то, что такое накодировал. Но вы мою последнюю сборку не смотрели. Я просто хотел чтобы вы в работе посмотрели, да и код не по теме. Но тогда выкладываю здесь под катом:
 Hidden text

Из кода удалил поля по 34, чтобы не захломлять код.
Обратите внимание, не забыл я про vbs. Теперь он работает у меня в au3 Smile Правда это только код для красоты. Надо либо au3 x32 использовать. Либо перенаправить на system32. Ну или использовать ТС х32. Известная проблема х64 систем. Ну и я про перекодировку. Как видите, я читаю из буфера 866 в 1251, а далее в утф. Вот хотелось-бы реализовать это в Ауторан. Если найдете минутку, помогите, пожалуйста.
Совсем забыл. Я-же добавил в WinScriptsAdv количество полей. А то 21 поле совсем мало. Сделал 40 вроде. На оф. форуме Гислера ссылку дал.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1093

Post (Separately) Posted: Fri May 08, 2026 18:58    Post subject: Reply with quote

Даёшь 15000 строк на Autorun! Mr. Green
https://wdho.ru/kMV2
https://www.upload.ee/files/19326966/TC_11.57.7z.html

По сравнению с предыдущей версией добавлено всего 500 строк, не густо за три месяца. Но если я продолжу в том же духе еще 30 лет, как Гислер, это будет 200000 строк! Mr. Green

AkulaBig wrote:
сначала надо из 866 перекодировать в 1251, а затем в утф.

Всё так же через объект Buffer. Закинуть в нужной кодировке и вынуть в нужной кодировке
Code:
Local nSize = StrLen(text)
Local buf = Buffer(nSize)
buf.Zero()
buf.SetStr(ansi, 0, nSize, "CP:866")
utf8 = buf.GetStr(0, nSize, "CP:65001")   
Free(buf)

AkulaBig wrote:
На данный момент я решил отказаться от реализации этой идеи. Очень мне не нравится, что все держится на wait.

И все-таки опция -stay_open даёт прирост в скорости, даже значительный. А через файл пришлось делать по необходимости. Лучше сразу через stdout считывать. Был пример для au3, можно в теории попробовать.
AkulaBig wrote:
Если найдете минутку

Ну, если код выше не поможет, то только до лучших времён. Я на каникулы! Very Happy
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 547

Post (Separately) Posted: Fri May 08, 2026 19:05    Post subject: Reply with quote

Orion9 wrote:
Ну, если код выше не поможет, то только до лучших времён.

Так конечно я в первую очередь попробовал.
Orion9 wrote:
Я на каникулы!

Понятно. Хорошего отдыха.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 229, 230, 231
Page 231 of 231

 
Jump to:  
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