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 

Использование wdx-плагинов в скриптах

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Sat Oct 03, 2009 21:48    Post subject: Использование wdx-плагинов в скриптах Reply with quote

Из темы Сортировка mp3 по каталогам с учётом id3 тегов.:
Lev wrote:
Имхо, лучше в отдельной теме.
Для скриптов было бы интересно оформление в виде ActiveX, чтобы не возиться с WshShell.Exec, StdOut...

Решил начать тему.
Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Wed Oct 07, 2009 18:24    Post subject: Reply with quote

Накидал краткий пример получения поля контентного плагина при помощи 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 пока не знаю, самому писать обёртку лень.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Thu Oct 08, 2009 09:49    Post subject: Reply with quote

Lev
Отлично!

Я вот, правда, хочу оформить в vbs-скрипте вызов wdx непосредственно как dll. Только пока, к сожалению, нет возможности уделить на это время Sad
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 735

Post (Separately) Posted: Thu Oct 08, 2009 11:09    Post subject: Reply with quote

Если интересно, вот моя реализация на 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 очень помогает.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1725
Location: Арзамас

Post (Separately) Posted: Mon Jan 25, 2010 10:37    Post subject: Re: Использование wdx-плагинов в скриптах Reply with quote

Batya wrote:
Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?
Batya wrote:
хочу оформить в vbs-скрипте вызов wdx непосредственно как dll
С помощью вот этого не получится?
Пишут: предоставляет возможность из скриптов на JScript и VBScript вызывать функции, экспортируемые dll-библиотеками
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Tue Jan 26, 2010 19:56    Post subject: Reply with quote

Tol!k
Спасибо, но ...
Batya wrote:
Только пока, к сожалению, нет возможности уделить на это время

Sad
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Fri Jan 29, 2010 02:25    Post subject: Reply with quote

wdx ActiveX
Решил создать отдельную тему, чтобы не валить всё в кучу.
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

Post (Separately) Posted: Sun Oct 03, 2010 16:45    Post subject: Reply with quote

Lev wrote:

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

Рассекреченный wdx.exe (точнее это переписанная с нуля утиль) выложил в родительской теме (см. ссылку в первом посте в этой теме), так что можете получать все поля напрямую, без выкусывания нужных значений регулярками.
П.С. Кстати, Loopback выложил хороший скрипт, но там есть мелкие ошибки и плюс не со всеми плагами он будет работать (в частности с ShellDetails.wdx вряд ли заработает, равно как и wdxtest.exe).
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Mon Oct 04, 2010 15:25    Post subject: Reply with quote

[off]Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог :)[/off]
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

Post (Separately) Posted: Mon Oct 04, 2010 17:52    Post subject: Reply with quote

Странно, вроде раньше не было проблем, тогда куда лучше переложить?
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Mon Oct 04, 2010 19:11    Post subject: Reply with quote

[off]Любой долгонеудаляемый обменник без пометки "только для AU-IX", или как его там. Например, завести сайтик второго уровня на каком-нибудь из кучи позволяющих это сайтов типа почтовых сервисов.
А лучше всего получить статус автора на totalcmd.net/wincmd.ru, а заодно и поддоменчик у наших уважаемых админов.[/off]
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 5894
Location: Москва

Post (Separately) Posted: Mon Oct 04, 2010 20:01    Post subject: Reply with quote

[off]
Lev wrote:
а заодно и поддоменчик у наших уважаемых админов.
Сразу уточню, что поддоменчик не получится. А вот акк — запросто.
[/off]
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1725
Location: Арзамас

Post (Separately) Posted: Mon Oct 04, 2010 21:09    Post subject: Reply with quote

[offtop]
Lev wrote:
Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог Smile
Ты бы описал проблему попроще и кто-нибудь обязательно переложил бы утиль на другой обменник.
Я без проблем скачал обе утилиты не смотря на карточку "Non AU-IX IP ..."
[/offtop]
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

Post (Separately) Posted: Mon Oct 04, 2010 21:36    Post subject: Reply with quote

Создал отдельную тему и выложил файл на мультиобиенник.
Тема - http://forum.wincmd.ru/viewtopic.php?t=13510
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1100

Post (Separately) Posted: Sun Jun 12, 2016 16:35    Post subject: Reply with quote

Loopback
А с какой версией AutoIt вы используете (или использовали) скрипт для тестирования плагинов? 3.3.8.1 и 3.3.12.0 падают, попробовал версии старее, ориентируясь на дату поста: с 3.2.12.1-3.3.2.0 не работает.
Вроде код очевиден, но не пойму куда копать.
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
Page 1 of 1

 
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