Страница 1 из 1
Использование wdx-плагинов в скриптах
Добавлено: Сб окт 03, 2009 21:48
Batya
Из темы
Сортировка mp3 по каталогам с учётом id3 тегов.:
Lev писал(а):Имхо, лучше в отдельной теме.
Для скриптов было бы интересно оформление в виде ActiveX, чтобы не возиться с WshShell.Exec, StdOut...
Решил начать тему.
Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?
Добавлено: Ср окт 07, 2009 18:24
Lev
Накидал краткий пример получения поля контентного плагина при помощи wdxtest.exe. Получаем все поля с помощью утилиты, а затем RegExp'ами выкусываем из текстовки нужные значения. Без обработки ошибок.
Код: Выделить всё
'получение поля контентного плагина при помощи 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 пока не знаю, самому писать обёртку лень.
Добавлено: Чт окт 08, 2009 09:49
Batya
Lev
Отлично!
Я вот, правда, хочу оформить в vbs-скрипте вызов wdx непосредственно как dll. Только пока, к сожалению, нет возможности уделить на это время

Добавлено: Чт окт 08, 2009 11:09
Loopback
Если интересно, вот моя реализация на Autoit, я с помощью этого скрипта тестирую плагины. Переделать под конкретные нужды и прикрутить обработку регэкспами - дело нескольких десятков минут.
Код: Выделить всё
#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 очень помогает.
Re: Использование wdx-плагинов в скриптах
Добавлено: Пн янв 25, 2010 09:37
Tol!k
Batya писал(а):Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?
Batya писал(а):хочу оформить в vbs-скрипте вызов wdx непосредственно как dll
С помощью
вот этого не получится?
Пишут:
предоставляет возможность из скриптов на JScript и VBScript вызывать функции, экспортируемые dll-библиотеками
Добавлено: Вт янв 26, 2010 18:56
Batya
Tol!k
Спасибо, но ...
Batya писал(а):Только пока, к сожалению, нет возможности уделить на это время

Добавлено: Пт янв 29, 2010 01:25
Lev
wdx ActiveX
Решил создать отдельную тему, чтобы не валить всё в кучу.
Добавлено: Вс окт 03, 2010 16:45
Samwatas
Lev писал(а):
Когда рассекретится wdx.exe, возможно, сможем получать нужные поля напрямую, что ускорит обработку большого количества файлов.
Рассекреченный wdx.exe (точнее это переписанная с нуля утиль) выложил в родительской теме (см. ссылку в первом посте в этой теме), так что можете получать все поля напрямую, без выкусывания нужных значений регулярками.
П.С. Кстати,
Loopback выложил хороший скрипт, но там есть мелкие ошибки и плюс не со всеми плагами он будет работать (в частности с ShellDetails.wdx вряд ли заработает, равно как и wdxtest.exe).
Добавлено: Пн окт 04, 2010 15:25
Lev
[off]Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог :)[/off]
Добавлено: Пн окт 04, 2010 17:52
Samwatas
Странно, вроде раньше не было проблем, тогда куда лучше переложить?
Добавлено: Пн окт 04, 2010 19:11
Lev
[off]Любой долгонеудаляемый обменник без пометки "только для AU-IX", или как его там. Например, завести сайтик второго уровня на каком-нибудь из кучи позволяющих это сайтов типа почтовых сервисов.
А лучше всего получить статус автора на totalcmd.net/wincmd.ru, а заодно и поддоменчик у наших уважаемых админов.[/off]
Добавлено: Пн окт 04, 2010 20:01
CaptainFlint
[off]
Lev писал(а):а заодно и поддоменчик у наших уважаемых админов.
Сразу уточню, что поддоменчик не получится. А вот акк —
запросто.
[/off]
Добавлено: Пн окт 04, 2010 21:09
Tol!k
[offtop]
Lev писал(а):Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог

Ты бы описал проблему попроще и кто-нибудь обязательно переложил бы утиль на другой обменник.
Я без проблем скачал обе утилиты не смотря на карточку "Non AU-IX IP ..."
[/offtop]
Добавлено: Пн окт 04, 2010 21:36
Samwatas
Создал отдельную тему и выложил файл на мультиобиенник.
Тема -
http://forum.wincmd.ru/viewtopic.php?t=13510
Добавлено: Вс июн 12, 2016 15:35
Skif_off
Loopback
А с какой версией AutoIt вы используете (или использовали) скрипт для тестирования плагинов? 3.3.8.1 и 3.3.12.0 падают, попробовал версии старее, ориентируясь на дату поста: с 3.2.12.1-3.3.2.0 не работает.
Вроде код очевиден, но не пойму куда копать.