[wdx] WinScript Advanced Content Plugin (x86\x64) (new)

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

dzigloTC
Замечание за нарушение правил форума. Ровно никакой повышенной важности ваше выделение полужирным шрифтом не имело. Сообщение приведено к приемлемому состоянию. Кроме того, вы злоупотребляете ненужным цитированием.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

dzigloTC писал(а):Вы не могли бы подробнее рассказать, как это сделать?
Для начала установить плагин по общим правилам (1, 2, 3).
Потом закинуть этот (с лёгкой правкой предыдущего) скрипт в ...\Plugins\wdx\WinScriptsAdv\Scripts\, выполнив предписания из шапки ¹:[cut="TextSearch.au3"]

Код: Выделить всё

;:::::::::::::::::::::::::::::: TextSearch.au3 :::::::::::::::::::::::::::::
; Назначение: поиск вхождений заданных подстрок в текстовом содержимом файла

; Положить blb2txt.exe в %COMMANDER_PATH%\Plugins\wdx\WinScriptsAdv\Scripts\
; Программа доступна по следующей ссылке:  http://balabolka.site/blb2txt.zip
; Поддержка: azw, azw3, chm, djvu, doc(x), eml, epub, fb2, fb3, htm(l), odp,
; ods, odt, mobi, litmht, pdb, pdf, ppt(x), prc, rtf, tcr, wpd, wri, xls(x),
; а также любых текстовых файлов по списку заданных в options.ini расширений
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#NoTrayIcon
Opt('MustDeclareVars', 1)
Dim $FileName
If FileGetSize($FileName) = 0 Then
  $FileName = ObjCreate('Shell.Application').NameSpace(0).ParseName($FileName).ExtendedProperty('LinkTarget')
  If Not $FileName Then Exit
  If Not FileGetSize($FileName) Then Exit
EndIf
Dim $Ext, $PID, $Text, $Text2, $Content, $Content1, $Content2
$Ext = StringRegExp($FileName, '((?<=\.)[^.]+|)$', 1)[0]
If Not $Ext Then Exit
If StringInStr('|azw|azw3|chm|djvu|doc|docx|eml|epub|fb2|fb3|htm|html|lit|mht|mobi|odp|ods|odt|pdb|pdf|ppt|pptx|prc|rtf|tcr|wpd|wri|xls|xlsx|', '|' & $Ext & '|', 2) Then
  $PID = Run('"' & EnvGet('COMMANDER_PATH') & '\Plugins\wdx\WinScriptsAdv\Scripts\blb2txt.exe" -f "' & $FileName & '" -o -rpn -sn -ss','', 0, 2)
  While 1
    $Text = StdoutRead($PID, 1)
    If $Text Then
      If $Text = $Text2 Then ExitLoop
    EndIf
    $Text2 = $Text
  WEnd
  $Text2 = ''
  StdioClose($PID)
Else
  Dim $oFile
  $oFile = FileOpen($FileName)
  $Text  = FileRead($oFile)
  FileClose($oFile)
EndIf
$Content  = StringInStr($Text, 'искомый текст 1')
$Content1 = StringInStr($Text, 'искомый текст 2')
$Content2 = StringInStr($Text, 'Искомый текст 3')
$Text = ''
Вместо искомый текст 1/2/3 пишем свой.[/cut]
[cut="Отредактировать options.ini из корневой папки плагина по схожему принципу:"]
options.ini писал(а):[Script]
ActiveScripts=...|TextSearch

; тут остальное

[TextSearch]
Script=TextSearch.au3
content=Заголовок 1
content1=Заголовок 2
content2=Заголовок 3
extensions=azw|azw3|bar|chm|cfg|conf|djvu|doc|docx|eml|epub|fb2|fb3|inf|ini|ion|htm|html|lit|lng|log|lst|me|mht|mobi|odp|ods|odt|pdb|pdf|ppt|pptx|prc|rtf|tcr|text|txt|wpd|wri|xls|xlsx
|etc
FoldersPaths=0
Вместо Заголовок 1/2/3 пишем свои именования полей.
Забрать AuToIt_x64.exe (с учётом битности ТС) из последнего zip-a (autoit-v3.3.15.3.zip на тек. момент), закинуть в удобную папку и прописать путь в соотв. ключе. Пример:
[ExeScriptParsers]
au3=%COMMANDER_PATH%\Scripts\AutoIt\AutoIt3_x64.exe
[/cut]Перезапустить ТС и искать на вкладке Плагины по принципу:
winscriptsadv | Заголовок 1 | Рег. выраж. | ^[1-9]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Segmentum
Сообщения: 21
Зарегистрирован: Вт окт 13, 2020 12:59

Сообщение Segmentum »

Можно ли использовать в скриптах для WinScript Advanced данные из других wdx плагинов Total Commander?
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Segmentum
Можно, тут писал, как.
Аватара пользователя
Zmy
Сообщения: 78
Зарегистрирован: Пн апр 06, 2015 12:52

Сообщение Zmy »

Skif_off, вы не поняли тонкий троллинг.

Для чего такое делать?

Не легче ли создать свой собственный набор колонок?
С любыми полями, из любых плагинов.

С помощью стандартных средств такого, как хочет TS, сделать невозможно.
Чтобы такое делать, нужно понимать, как Гислер подгружает плагины.

Для чего нужны посредники?

Такое можно сделать, но возникает вопрос:

Зачем создавать сложное, если можно сделать лёгкое?
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Zmy писал(а):Не легче ли создать свой собственный набор колонок?
С любыми полями, из любых плагинов.
Суть в том, что данные поля(ей) необходимо как-то использовать и выдать полученный результат. Либо существующие плагины не предоставляют необходимого.
Zmy писал(а):С помощью стандартных средств такого, как хочет TS, сделать невозможно.
Чтобы такое делать, нужно понимать, как Гислер подгружает плагины.
Плагин - это просто dll'ка с расширением w?x, в ряде случаев её можно запросто загрузить и вызывать её функции самыми что ни на есть стандартными средствами (точно так же их и Гислер подгружает).

В принципе, разнообразные данные можно получать с помощью консольных утилит, тупо запуская и читая их вывод, без использования других wdx-плагинов напрямую (хотя они и могут упростить).
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Из другой ветки:
Monarch-LFV писал(а):Возникла необходимость вытаскивать содержимое определеной ячейки в файле Excel (например "Лист1!C12")
Эх, давно не брал я шашки в руки :)

Код: Выделить всё

'=================================================
' Script for WinScriptAdv content plugin

' Возвращает значение ячейки Excel
'=================================================

'========== Изменяемые параметры =================
Const Addr = "Лист1!C12"  ' Адрес ячейки
'=================================================

content = Result(filename, Addr)

Function GetCellValue(pXl, pFile, pAddr)
  pXl.Visible = False
  pXl.DisplayAlerts = False
  Call pXl.Workbooks.Open(pFile, , True)
  GetCellValue = pXL.Range(pAddr)
End Function

Function Result(pFile, byVal pAddr)
  Dim objXL
  Set objXL = CreateObject("Excel.Application")
  On Error Resume Next
  Result = GetCellValue(objXL, pFile, pAddr)
  On Error Goto 0
  objXL.Quit()
  Set objXL = Nothing
End Function
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Batya
Спасибо, очень круто получилось, несмотря на то, что уже сам реализовал на VBA в Экселе. В VBS сам не силен, несмотря на то, что вроде близкие языки.
Мне уже особо не нужно, но ради интереса можно развить тему, просто номер строки не обязательно может быть 12, как в примере. В качестве примера, представьте себе сметы, где разное количество строк, где-то 11, где-то 100, где-то 123... Но в конце, например в столбце "B" всегда имеется фраза "Итого по смете:", так вот например нужно получить значение в этой строке в столбце "C".
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Monarch-LFV
Без проблем:

Код: Выделить всё

'=================================================
' Script for WinScriptAdv content plugin

' Возвращает значение последней ячейки Excel в указанном столбце
'=================================================

'========== Изменяемые параметры =================
Const Addr = "Лист1!C"  ' Адрес ячейки без строки
'=================================================

content = Result(filename, Addr)

Function GetCellValue(pXl, pFile, pAddr)
  Dim lRow, lSh
  pXl.Visible = False
  pXl.DisplayAlerts = False
  Call pXl.Workbooks.Open(pFile, , True)
  If InStr(pAddr, "!") > 0 Then
    Set lSh = pXl.Worksheets(Left(pAddr, InStr(pAddr, "!") - 1))
  Else
    Set lSh = pXl.ActiveSheet
  End If
  lRow = lSh.UsedRange.Find("*", , , , , 2).Row
  GetCellValue = lSh.Range(pAddr & CStr(lRow))
  Set lSh = Nothing
End Function

Function Result(pFile, byVal pAddr)
  Dim objXL
  Set objXL = CreateObject("Excel.Application")
  On Error Resume Next
  Result = GetCellValue(objXL, pFile, pAddr)
  On Error Goto 0
  objXL.Quit()
  Set objXL = Nothing
End Function
Нет, я не сплю. Я просто медленно моргаю.
Mailk
Сообщения: 251
Зарегистрирован: Сб янв 16, 2010 20:19

Сообщение Mailk »

А у меня бухгалтерские pdf счета.
Нужно вывести в столбец данны по ним .
Реально такое?
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Batya
Немного не то. Здесь вы ищете просто последнюю строку, а нужно номер строки, в которой в столбце "B" фраза "Итого по смете:". Она может быть далеко не последней (после нее могут быть поля для подписи например).
Для понимания, если написать формулой в экселе, то получилось бы следующее:

Код: Выделить всё

=ВПР("Итого по смете:";B:C;2;ЛОЖЬ)
Mailk
Уже ведь обсуждали в ветке http://forum.wincmd.ru/viewtopic.php?t= ... &&start=30
Или вышлете пример, я посмотрю.
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Batya
На основе вашего кода написал нужный мне код:

Код: Выделить всё

''=================================================
' Script for WinScriptAdv content plugin

' Возвращает значение найденной ячейки Excel в указанном столбце
' по принципу =ВПР("Итого по смете:";B:C;2;ЛОЖЬ)
'=================================================

'========== Изменяемые параметры =================
Const Addr = "Лист1!C"  ' Адрес ячейки без строки
Const columnConst = "B:B"  ' В каких столбцах должно быть найдено постоянное значение
Const ValueConst = "Итого по смете:"  ' Само постоянное значение
'=================================================

content = Result(filename, Addr)

Function GetCellValue(pXl, pFile, pAddr)
  Dim lRow, lSh
  pXl.Visible = False
  pXl.DisplayAlerts = False
  Call pXl.Workbooks.Open(pFile, , True)
  If InStr(pAddr, "!") > 0 Then
    Set lSh = pXl.Worksheets(Left(pAddr, InStr(pAddr, "!") - 1))
  Else
    Set lSh = pXl.ActiveSheet
  End If
  lRow = lSh.Range(columnConst).Find(ValueConst, , , , , 1).Row
  GetCellValue = lSh.Range(Addr & lRow)
  Set lSh = Nothing
End Function

Function Result(pFile, byVal pAddr)
  Dim objXL
  Set objXL = CreateObject("Excel.Application")
  On Error Resume Next
  Result = GetCellValue(objXL, pFile, pAddr)
  On Error Goto 0
  objXL.Quit()
  Set objXL = Nothing
End Function
Спасибо за наводку!
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Немного разобравшись, написал еще один скрипт для плагина, может кому-нибудь пригодится (похож на работу плагина Expander2):

Код: Выделить всё

' Script for WinScriptAdv content plugin
' 
' Разделяет имена папок и файлов по заданному разделителю

'========== Изменяемые параметры =================
Const Separator = " - " 
'=================================================

Dim fs, f, fn 
on error resume next
Set fs = CreateObject("Scripting.FileSystemObject") 
Set f  = fs.GetFolder(filename)
fn = f.name ' Имя папки
fn = fs.GetBaseName(filename) ' Имя файла

content = fn ' Полное имя файла
content1 = split(fn, Separator)(0) ' Часть 1
content2 = split(fn, Separator)(1) ' Часть 2
content3 = split(fn, Separator)(2) ' Часть 3
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Плагин поддерживает Unicode?

Пытаюсь запустить в нем AutoHotkey второй версии.

Вижу, что он создает файл во временном каталоге WinScriptAdvFile_.ahk в формате ANSI, что приводит к утере уникодных имен файлов в переменной filename и неработаспособности файловых функций.

Как решить проблему?
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Заметил, что плагин на разных windows ведет себя по разному. В options.ini оставил одну запись:

Код: Выделить всё

[Script]
ActiveScripts=Test

[Test]
Script=Test.vbs
content=Test
extensions=*
FoldersPaths=0
В файле Test.vbs просто:

Код: Выделить всё

content = 1
При добавлении колонки поведение следующее:
1. Win7x64: TCх32 - при первом (!) обращении в диалоговом окне выпадает ошибка:

Код: Выделить всё

Crash in plugin WinscriptsADV.wdx:
External exception EEDFADE
После добавления колонки, не смотря на ошибку все работает как надо и повторно такая ошибка не выдается.

2. Win7x64: TCх64 - тотал сразу падает без каких-либо сообщений.
Текст дампа прилагаю:
[cut="Дамп"]*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************

*** WARNING: Unable to verify timestamp for totalcmd64.exe
*** WARNING: Unable to verify checksum for Autorun_Tweaks.dll64
*** WARNING: Unable to verify checksum for UnicodeTest.wdx64

KEY_VALUES_STRING: 1

Key : Analysis.CPU.mSec
Value: 733

Key : Analysis.DebugAnalysisManager
Value: Create

Key : Analysis.Elapsed.mSec
Value: 3173

Key : Analysis.Init.CPU.mSec
Value: 342

Key : Analysis.Init.Elapsed.mSec
Value: 34698

Key : Analysis.Memory.CommitPeak.Mb
Value: 69

Key : Timeline.OS.Boot.DeltaSec
Value: 462622

Key : Timeline.Process.Start.DeltaSec
Value: 10

Key : WER.Process.Version
Value: 11.3.0.0


FILE_IN_CAB: TOTALCMD64.EXE_240313_190806-1.dmp

COMMENT:
*** "C:\path\procdump64.exe" -accepteula -ma -j "c:\dumps" 4176 172 000000000CC40000
*** Just-In-Time debugger. PID: 4176 Event Handle: 172 JIT Context: .jdinfo 0xcc40000

NTGLOBALFLAG: 0

PROCESS_BAM_CURRENT_THROTTLED: 0

PROCESS_BAM_PREVIOUS_THROTTLED: 0

APPLICATION_VERIFIER_FLAGS: 0

CONTEXT: (.ecxr)
rax=000000007bab4924 rbx=000000000000000e rcx=00000000175add90
rdx=0000000000000148 rsi=0000000000000048 rdi=000000007761ab98
rip=000007fefd21a06d rsp=00000000175ae3a0 rbp=00000000175ae470
r8=0000000000000000 r9=0000000000000000 r10=0000000000000000
r11=00000000175ae3e0 r12=0000000000000000 r13=000000000d59f626
r14=000000000d59ee08 r15=0000000000000017
iopl=0 nv up ei pl nz na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000204
KERNELBASE!RaiseException+0x39:
000007fe`fd21a06d 4881c4c8000000 add rsp,0C8h
Resetting default scope

EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 000007fefd21a06d (KERNELBASE!RaiseException+0x0000000000000039)
ExceptionCode: 0eedfade
ExceptionFlags: 00000001
NumberParameters: 7
Parameter[0]: 000000000f02cde7
Parameter[1]: 000000000f1b5cf0
Parameter[2]: 0000000000000000
Parameter[3]: 0000000000000000
Parameter[4]: 0000000000000000
Parameter[5]: 0000000000000000
Parameter[6]: 0000000000000000

PROCESS_NAME: totalcmd64.exe

ERROR_CODE: (NTSTATUS) 0xeedfade - <Unable to get error code text>

EXCEPTION_CODE_STR: eedfade

EXCEPTION_PARAMETER1: 000000000f02cde7

EXCEPTION_PARAMETER2: 000000000f1b5cf0

EXCEPTION_PARAMETER3: 0000000000000000

EXCEPTION_PARAMETER4: 0

STACK_TEXT:
00000000`175ae3a0 00000000`0ef3d9b3 : 00000000`00000017 00000000`0d59ee08 00000000`0f02f0a8 00000000`175ae460 : KERNELBASE!RaiseException+0x39
00000000`175ae470 00000000`0ef3da18 : 00000000`0f02e370 00000000`0ef3bf91 00000000`00000000 00000000`175ae530 : WinScriptsAdv+0xd9b3
00000000`175ae580 00000000`0f02e738 : 00000000`175ae5e0 00000000`0f062718 00000000`0f1b47b0 00000000`0f171a20 : WinScriptsAdv+0xda18
00000000`175ae5c0 00000000`0f02f8eb : 00000000`0f1c4bc0 00000000`175ae601 00000000`0f171a01 00000000`00000000 : WinScriptsAdv!_dbk_fcall_wrapper+0xe6d68
00000000`175ae610 00000000`0f032d2b : 00000000`0f1b47b0 00000000`0f1801d0 00000000`00000011 00000000`0390e154 : WinScriptsAdv!_dbk_fcall_wrapper+0xe7f1b
00000000`175ae660 00000000`0f0325c0 : 00000000`00000000 00000000`0f171a20 00000000`0000004c 00000000`0ef3e78c : WinScriptsAdv!_dbk_fcall_wrapper+0xeb35b
00000000`175ae6c0 00000000`0f034083 : 00000000`175ae7b0 00000000`0ef3fbb2 00000000`00000000 00000000`00000000 : WinScriptsAdv!_dbk_fcall_wrapper+0xeabf0
00000000`175ae760 00000000`0f034227 : 00000000`175ae810 00000000`004101f8 00000000`175ae810 00000000`009106c1 : WinScriptsAdv!_dbk_fcall_wrapper+0xec6b3
00000000`175ae7b0 00000000`00a0ac02 : 00000000`0000003c 00000000`03953328 00000000`175ae890 000007fe`fd202117 : WinScriptsAdv!ContentGetValueW+0x67
00000000`175ae820 00000000`0000003c : 00000000`03953328 00000000`175ae890 000007fe`fd202117 00000000`00000800 : totalcmd64+0x60ac02
00000000`175ae828 00000000`03953328 : 00000000`175ae890 000007fe`fd202117 00000000`00000800 00000000`00000000 : 0x3c
00000000`175ae830 00000000`175ae890 : 000007fe`fd202117 00000000`00000800 00000000`00000000 00000000`00000000 : 0x3953328
00000000`175ae838 000007fe`fd202117 : 00000000`00000800 00000000`00000000 00000000`00000000 00000000`00000000 : 0x175ae890
00000000`175ae840 00000000`175ae820 : 00000000`00a0ab69 00000000`175af308 00000000`00000001 00000000`175ae8e8 : KERNELBASE!MultiByteToWideChar+0x1bc
00000000`175ae920 00000000`00a0ab69 : 00000000`175af308 00000000`00000001 00000000`175ae8e8 00000000`00000000 : 0x175ae820
00000000`175ae928 00000000`175af308 : 00000000`00000001 00000000`175ae8e8 00000000`00000000 00000000`00000001 : totalcmd64+0x60ab69
00000000`175ae930 00000000`00000001 : 00000000`175ae8e8 00000000`00000000 00000000`00000001 00000000`00000000 : 0x175af308
00000000`175ae938 00000000`175ae8e8 : 00000000`00000000 00000000`00000001 00000000`00000000 0050005c`003a0044 : 0x1
00000000`175ae940 00000000`00000000 : 00000000`00000001 00000000`00000000 0050005c`003a0044 00720067`006f0072 : 0x175ae8e8


SYMBOL_NAME: winscriptsadv+d9b3

MODULE_NAME: WinScriptsAdv

IMAGE_NAME: WinScriptsAdv.wdx64

STACK_COMMAND: ~15s; .ecxr ; kb

FAILURE_BUCKET_ID: DELPHI_EXCEPTION_eedfade_WinScriptsAdv.wdx64!Unknown

OSPLATFORM_TYPE: x64

OSNAME: Windows 7

IMAGE_VERSION: 1.0.0.0

FAILURE_ID_HASH: {f5c80c57-1278-d0dc-8732-f042985abf14}

Followup: MachineOwner
---------

[/cut]

3. Win10x64: TCх32 и ТСх64 - никаких ошибок нет.

Может кто-нибудь подтвердить/опровергнуть такое поведение? И как с ним бороться?
Ответить