Страница 14 из 20

Добавлено: Чт июл 09, 2020 12:05
Avada
dzigloTC
Замечание за нарушение правил форума. Ровно никакой повышенной важности ваше выделение полужирным шрифтом не имело. Сообщение приведено к приемлемому состоянию. Кроме того, вы злоупотребляете ненужным цитированием.

Добавлено: Чт июл 09, 2020 22:54
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]

Добавлено: Вс ноя 29, 2020 23:17
Segmentum
Можно ли использовать в скриптах для WinScript Advanced данные из других wdx плагинов Total Commander?

Добавлено: Вс дек 06, 2020 07:47
Skif_off
Segmentum
Можно, тут писал, как.

Добавлено: Пн дек 07, 2020 17:05
Zmy
Skif_off, вы не поняли тонкий троллинг.

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

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

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

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

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

Зачем создавать сложное, если можно сделать лёгкое?

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

В принципе, разнообразные данные можно получать с помощью консольных утилит, тупо запуская и читая их вывод, без использования других wdx-плагинов напрямую (хотя они и могут упростить).

Добавлено: Ср фев 24, 2021 17:46
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

Добавлено: Чт фев 25, 2021 16:13
Monarch-LFV
Batya
Спасибо, очень круто получилось, несмотря на то, что уже сам реализовал на VBA в Экселе. В VBS сам не силен, несмотря на то, что вроде близкие языки.
Мне уже особо не нужно, но ради интереса можно развить тему, просто номер строки не обязательно может быть 12, как в примере. В качестве примера, представьте себе сметы, где разное количество строк, где-то 11, где-то 100, где-то 123... Но в конце, например в столбце "B" всегда имеется фраза "Итого по смете:", так вот например нужно получить значение в этой строке в столбце "C".

Добавлено: Чт фев 25, 2021 18:28
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

Добавлено: Пт фев 26, 2021 02:38
Mailk
А у меня бухгалтерские pdf счета.
Нужно вывести в столбец данны по ним .
Реально такое?

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

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

=ВПР("Итого по смете:";B:C;2;ЛОЖЬ)
Mailk
Уже ведь обсуждали в ветке http://forum.wincmd.ru/viewtopic.php?t= ... &&start=30
Или вышлете пример, я посмотрю.

Добавлено: Сб фев 27, 2021 05:02
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
Спасибо за наводку!

Добавлено: Вс фев 28, 2021 04:48
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

Добавлено: Вт фев 13, 2024 11:55
Orion9
Плагин поддерживает Unicode?

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

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

Как решить проблему?

Добавлено: Ср мар 13, 2024 12:52
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 - никаких ошибок нет.

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