Использование wdx-плагинов в скриптах
Select messages from
# through # FAQ
[/[Print]\]

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

#1: Использование wdx-плагинов в скриптах Author: BatyaLocation: Москва, Россия PostPosted: Sat Oct 03, 2009 21:48
    —
Из темы Сортировка mp3 по каталогам с учётом id3 тегов.:
Lev wrote:
Имхо, лучше в отдельной теме.
Для скриптов было бы интересно оформление в виде ActiveX, чтобы не возиться с WshShell.Exec, StdOut...

Решил начать тему.
Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?

#2:  Author: Lev PostPosted: Wed Oct 07, 2009 18:24
    —
Накидал краткий пример получения поля контентного плагина при помощи wdxtest.exe. Получаем все поля с помощью утилиты, а затем RegExp'ами выкусываем из текстовки нужные значения. Без обработки ошибок.

Code:
'получение поля контентного плагина при помощи wdxtest.exe
'lev
wdxtest="c:\WINCMD\utils\wdxtest\wdxtest.exe"'путь к wdxtest.exe
wdxplug="c:\WINCMD\Content_wdx\NameChrCount\Filename_ChrCount.wdx"'путь к контентному плагину
filename="c:\WINCMD\Content_wdx\NameChrCount\Filename_ChrCount.wdx"'путь к файлу инфу о котором получаем

Set WshShell = CreateObject("WScript.Shell")
Set res=WshShell.Exec(wdxtest & " " & wdxplug & " " & filename)
c=res.StdOut.ReadAll

'MsgBox c 'для отладки, для составления правильного паттерна
Dim re

Set re = New RegExp
re.Global = True
re.IgnoreCase = True
re.MultiLine = False

re.Pattern = "1: Filename \(ChrCount\): (.*)" 'кол-во букв в имени файла
 
Set field=re.Execute(c)
MsgBox field(0).Submatches(0)
Теперь можем создавать директории, двигать и переименовывать файлы и т.д. и т.п.
Когда рассекретится wdx.exe, возможно, сможем получать нужные поля напрямую, что ускорит обработку большого количества файлов. Чем работать с wdx по ActiveX пока не знаю, самому писать обёртку лень.

#3:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Oct 08, 2009 09:49
    —
Lev
Отлично!

Я вот, правда, хочу оформить в vbs-скрипте вызов wdx непосредственно как dll. Только пока, к сожалению, нет возможности уделить на это время Sad

#4:  Author: Loopback PostPosted: Thu Oct 08, 2009 11:09
    —
Если интересно, вот моя реализация на Autoit, я с помощью этого скрипта тестирую плагины. Переделать под конкретные нужды и прикрутить обработку регэкспами - дело нескольких десятков минут.
Code:

#include <Array.au3>

Global $sFile = @ScriptDir & "\TestTorrent.torrent"
Global $sWdxPlugin = @ScriptDir & "\TCTorrent.wlx"
Global $nUnitIdx = 0

Global Const $ft_nomorefields = 0
Global Const $ft_numeric_32 = 1
Global Const $ft_numeric_64 = 2
Global Const $ft_numeric_floating = 3
Global Const $ft_date = 4
Global Const $ft_time = 5
Global Const $ft_boolean = 6
Global Const $ft_multiplechoice = 7
Global Const $ft_string = 8
Global Const $ft_fulltext = 9
Global Const $ft_datetime = 10
Global Const $ft_stringw = 11

Global $aFields[1][3]

For $i = 0 To 255
    $aRet = DllCall($sWdxPlugin, "int", "ContentGetSupportedField", "int", $i, "str", "", "str", "", "int", 65535)
    If @error Then ExitLoop
    If $aRet[0] = $ft_nomorefields Then ExitLoop
    ReDim $aFields[$i+1][3]
    $aFields[$i][0] = $aRet[0]
    $aFields[$i][1] = $aRet[2]
    $aFields[$i][2] = $aRet[3]
Next

If UBound($aFields) = 0 Then
    MsgBox (0, "", "No fields.")
    Exit
EndIf

Global $aValues[UBound($aFields)][2]
Global $nMaxBuffSize = 65535
Global $pBuffer = DllStructCreate("byte[65535]")

For $i=0 To UBound($aFields) - 1
    $aRet = DllCall($sWdxPlugin, "int", "ContentGetValue", "str", $sFile, "int", $i, "int", $nUnitIdx, "ptr", DllStructGetPtr($pBuffer), "int", $nMaxBuffSize, "int", 0)
    If @error Then ExitLoop
    Switch $aFields[$i][0]
        Case $ft_numeric_32
            $pValue = DllStructCreate("int", DllStructGetPtr($pBuffer))
        Case $ft_numeric_64
            $pValue = DllStructCreate("int64", DllStructGetPtr($pBuffer))
        Case $ft_numeric_floating
            $pValue = DllStructCreate("double", DllStructGetPtr($pBuffer))
        Case $ft_string, $ft_fulltext
            $pValue = DllStructCreate("char[" & $nMaxBuffSize & "]", DllStructGetPtr($pBuffer))
        Case $ft_datetime
            $pFileTime = DllStructCreate("dword;dword", DllStructGetPtr($pBuffer))
            $pLocalTime = DllStructCreate("dword;dword")
            DllCall("Kernel32.dll", "int", "FileTimeToLocalFileTime", "ptr", DllStructGetPtr($pFileTime), "ptr", DllStructGetPtr($pLocalTime))
            $pValue = DllStructCreate("short;short;short;short;short;short;short;short")
            DllCall("Kernel32.dll", "int", "FileTimeToSystemTime", "ptr", DllStructGetPtr($pLocalTime), "ptr", DllStructGetPtr($pValue))
            $aValues[$i][0] = $aFields[$i][1]
            $aValues[$i][1] = StringFormat("%04d-%02d-%02d %02d:%02d:%02d", _
                                           DllStructGetData($pValue, 1), _
                                           DllStructGetData($pValue, 2), _
                                           DllStructGetData($pValue, 4), _
                                           DllStructGetData($pValue, 5), _
                                           DllStructGetData($pValue, 6), _
                                           DllStructGetData($pValue, 7))
            ContinueLoop
        Case Else
            ContinueLoop
    EndSwitch
    $aValues[$i][0] = $aFields[$i][1]
    $aValues[$i][1] = DllStructGetData($pValue, 1)
Next

_ArrayDisplay($aValues)

Готовой реализации через COM не знаю, писать тоже неохота, т.к. предпочитаю максимально портабельные решения, и в этом Autoit очень помогает.

#5: Re: Использование wdx-плагинов в скриптах Author: Tol!kLocation: Арзамас PostPosted: Mon Jan 25, 2010 10:37
    —
Batya wrote:
Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?
Batya wrote:
хочу оформить в vbs-скрипте вызов wdx непосредственно как dll
С помощью вот этого не получится?
Пишут: предоставляет возможность из скриптов на JScript и VBScript вызывать функции, экспортируемые dll-библиотеками

#6:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Jan 26, 2010 19:56
    —
Tol!k
Спасибо, но ...
Batya wrote:
Только пока, к сожалению, нет возможности уделить на это время

Sad

#7:  Author: Lev PostPosted: Fri Jan 29, 2010 02:25
    —
wdx ActiveX
Решил создать отдельную тему, чтобы не валить всё в кучу.

#8:  Author: Samwatas PostPosted: Sun Oct 03, 2010 16:45
    —
Lev wrote:

Когда рассекретится wdx.exe, возможно, сможем получать нужные поля напрямую, что ускорит обработку большого количества файлов.

Рассекреченный wdx.exe (точнее это переписанная с нуля утиль) выложил в родительской теме (см. ссылку в первом посте в этой теме), так что можете получать все поля напрямую, без выкусывания нужных значений регулярками.
П.С. Кстати, Loopback выложил хороший скрипт, но там есть мелкие ошибки и плюс не со всеми плагами он будет работать (в частности с ShellDetails.wdx вряд ли заработает, равно как и wdxtest.exe).

#9:  Author: Lev PostPosted: Mon Oct 04, 2010 15:25
    —
[off]Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог :)[/off]

#10:  Author: Samwatas PostPosted: Mon Oct 04, 2010 17:52
    —
Странно, вроде раньше не было проблем, тогда куда лучше переложить?

#11:  Author: Lev PostPosted: Mon Oct 04, 2010 19:11
    —
[off]Любой долгонеудаляемый обменник без пометки "только для AU-IX", или как его там. Например, завести сайтик второго уровня на каком-нибудь из кучи позволяющих это сайтов типа почтовых сервисов.
А лучше всего получить статус автора на totalcmd.net/wincmd.ru, а заодно и поддоменчик у наших уважаемых админов.[/off]

#12:  Author: CaptainFlintLocation: Москва PostPosted: Mon Oct 04, 2010 20:01
    —
[off]
Lev wrote:
а заодно и поддоменчик у наших уважаемых админов.
Сразу уточню, что поддоменчик не получится. А вот акк — запросто.
[/off]

#13:  Author: Tol!kLocation: Арзамас PostPosted: Mon Oct 04, 2010 21:09
    —
[offtop]
Lev wrote:
Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог Smile
Ты бы описал проблему попроще и кто-нибудь обязательно переложил бы утиль на другой обменник.
Я без проблем скачал обе утилиты не смотря на карточку "Non AU-IX IP ..."
[/offtop]

#14:  Author: Samwatas PostPosted: Mon Oct 04, 2010 21:36
    —
Создал отдельную тему и выложил файл на мультиобиенник.
Тема - http://forum.wincmd.ru/viewtopic.php?t=13510

#15:  Author: Skif_off PostPosted: Sun Jun 12, 2016 16:35
    —
Loopback
А с какой версией AutoIt вы используете (или использовали) скрипт для тестирования плагинов? 3.3.8.1 и 3.3.12.0 падают, попробовал версии старее, ориентируясь на дату поста: с 3.2.12.1-3.3.2.0 не работает.
Вроде код очевиден, но не пойму куда копать.



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


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

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group