Script Content Plugin

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

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

Аватара пользователя
Anger
Сообщения: 7
Зарегистрирован: Вт ноя 06, 2007 16:34

signatur.vbs

Сообщение Anger »

Lev, спасибо за скрипт на первой странице - пригодился.
Lev писал(а):Небольшой скрипт, который может быть полезен для поиска файлов с определенной сигнатурой (первые байты в файле).
...
content = content_str
...

Если в получаемой строке есть символы hex(00) (как например в первых 3 байтах контейнера MP4) - в текстовом виде строка вообще не выводится.

Поэтому нужно заменить на
content=Replace(content_str,Chr(0),Chr(1))
или на
content=Replace(content_str,Chr(0)," ")

Немного доработал скрипт ув.ricobautsch:

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

'signatur.vbs by ricobautsch
'edited by Anger 29.04.2010

'Script for Script Content Plugin (c)Lev Freidin, 2005
'http://www.totalcmd.net/plugring/script_wdx.html
'http://wincmd.ru/plugring/script_wdx.html
'
'Этот скрипт показывает 11 байт файла (nCharCnt=11) начиная с начала (nCharStart=0) в hex
'и тектовом представлении - может быть полезен для поиска файлов с определенной сигнатурой
'Возвращаемые параметры: Result=HEX, Result1=Text

const nCharStart = 0
const nCharCnt = 11

Set fso = CreateObject("Scripting.FileSystemObject") 
Set oTextStream = fso.OpenTextFile(filename) 

oTextStream.Skip(nCharStart)
If not oTextStream.AtEndOfStream Then
  content_str = oTextStream.Read(nCharCnt)

' Выводим Text в result1
  content1=Replace(content_str,Chr(0),Chr(1))

' Выводим HEX в result
    For i=1 To Len(content_str)
      If content <> "" Then 
        content = content & " " 
      End If 
      
      hex_value = Hex(Asc(Mid(content_str,i,1))) 
      
      content = content & string(2 - len(hex_value), "0") 
      content = content & hex_value 
    Next
'Else
'  content="EOF"
'  content1="EOF"
End If

oTextStream.Close
PS. Использую для поиска видео-файлов из кеша оперы.
Wincmd.ini

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

[Searches]
Video по содержимому > 500 кБ_SearchFor=
Video по содержимому > 500 кБ_SearchIn=
Video по содержимому > 500 кБ_SearchText=
Video по содержимому > 500 кБ_SearchFlags=0|000002000020|||||1|500|1||0000|
Video по содержимому > 500 кБ_plugin=script.Result1 contains FLV | script.Result1 contains mp4 | script.Result1 contains 3gp | script.Result1 contains AVI
Последний раз редактировалось Anger Пт апр 30, 2010 10:03, всего редактировалось 5 раз.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

В продолжение обсуждения в теме "Поиск папок с частично одинаковыми названиями" хотелось бы вернуться к вопросу возможности произвольно именовать колонки результатов.
Также хотелось бы увеличения количества колонок результатов.

Lev
Если не хочется запуска некольких скриптов, сделай приём результатов из скрипта, например, через ассоциированный массив (объект "Scripting.Dictionary"), у которого ключ - это имя результирующей колонки. Т.е. нечто вроде

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

content.Add "Новая колонка", "Результат"
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Lev писал(а):Автору плагина составляет труд даже понять, чего от него хотят :(
конфиг-параметр-отображаемое поле - я уже заблудился.
Может в обсуждение Script Content plugin'а перебраться?
ОК, переберемся и уточним.
При инициализации плагина читаешь конфиг и строишь список полей из специальной секции, а дальше - выдаешь эти поля Тоталу, когда тот вызывает ContentGetSupportedField, и потом при вызове ContentGetValue вызываешь тот или иной скрипт, в зависимости от индекса - каждое поле будет иметь свой индекс, который ТК будет сообщать, так что тут не запутаешься. Работы - чуть-чуть, просто хранить не одну строку на запуск скрипта, а два массива - названий полей и строк запуска скрипта, и обращаться к ним по мере необходимости.
В результате юзер при настройке набора колонок будет видеть не одно поле, которое плагин может вернуть, а несколько полей, которые он предварительно настроил, и будет достаточно одной копии плагина для запуска любого числа скриптов.

Посмотрел формат файла script.ini, если я так понял, в секции [Script] указано, какой из блоков файла используется в данный момент. Вполне можно в этой секции обрабатывать строки вида "имя поля"="имя блока скрипта", при этом все имеющиеся параметры секции можно получить, вызвав функцию перечисления параметров INI-файла.
Последний раз редактировалось MVV Вт май 25, 2010 16:56, всего редактировалось 1 раз.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

произвольно именовать колонки результатов.
В редакторе колонок можно дать любое желаемое имя колонкам.
Насколько я разобрался - список выводимых результатов плагина грузится при прописывании плагина в тотале, имена при первом вызове, при смене количества колонок и их имён надо будет перепрописывать плагин в тотале.
Теоретически можно динамически перепрописывать имёна колонок в wincmd.ini при каждом вызове плагина, но займусь ли я этим не знаю.
Переписывать имя колонок и количество при выдаче результата каждого файла для директории из тысячи файлов имхо не очень оптимально. Не знаю сохранятсяуже выданные результаты, при изменении количества колонок.
---
Ставил ли кто-нибудь опыты с созданием ссылки на плагин вместо заведения его дубля?
Последний раз редактировалось Lev Вт май 25, 2010 16:57, всего редактировалось 1 раз.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

При инициализации плагина читаешь конфиг...
Т.е. в ини файле будет прописано:
[Columns]
колонка1 = script1.vbs;content
колонка2 = script1.vbs;content1
Заголовок = script2.vbs;content
MyContent=script3.js;content
?
или ещё как-то?
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Lev писал(а):
При инициализации плагина читаешь конфиг...
Т.е. в ини файле будет прописано:
[Columns]
колонка1 = script1.vbs;content
колонка2 = script1.vbs;content1
Заголовок = script2.vbs;content
MyContent=script3.js;content
?
или ещё как-то?
Я там дополнил пост. Да, смысл такой. Совсем несложно делать переменное число полей плагина, просто один раз их Тоталу выдавать. А обновить список полей можно, вызвав cm_UnloadPlugins - при этом ТК загрузит плагин заново, тем самым запросив список полей еще раз.
В общем, если юзер имеет несколько скриптов, чтобы он мог видеть несколько контентных полей в плагине - например, поля AddZeroes, ExeUp, Ext, Html и т.п. (можно настроить их в дефолтном конфиге).
А как именно устроить конфиг - тут уж тебе как автору виднее. :)
Lev писал(а):Ставил ли кто-нибудь опыты с созданием ссылки на плагин вместо заведения его дубля?
Да. Правда, не с твоим плагином, но результат будет таким же - винда не загрузит новую копию уже загруженной в память библиотеки, просекает, что жесткая ссылка. Подробности.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Lev писал(а):Цитата:
произвольно именовать колонки результатов.
В редакторе колонок можно дать любое желаемое имя колонкам.
Сорри, за введение в заблуждение. Я имел ввиду произольные наименования полей плагина. Именно о чём дальше идёт обсуждение.

А чем не устраивает преложенный мной ранее вариант?
Batya писал(а):[Script]
Section=Defaults|Extension|AddZeros|exe-arc up|js
Batya писал(а):content.Add "Новая колонка", "Результат"
Т.е. начитываем поля из инишника из значения "Section".
Запускаем единственный скрипт. Результат работы скрипта - это массив content с ключами по именам описанных ранее в инишнике полей:

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

content.Add "Defaults", "Результат 1"
content.Add "Extension", "Результат 2"
content.Add "AddZeros", "Результат 3"
content.Add "exe-arc up", "Результат 4"
content.Add "js", "Результат 5"
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

будет достаточно одной копии плагина для запуска любого числа скриптов
Можно ведь запускать скрипты скриптом, т.е. можно не переделывать плагин, а написать скрипт вызывающий скрипты по заданному условию - имени текущей папки, ключу в некотором файле и т.п.
О наименованиях полей выдаваемых плагином подумаю. Я так понял, что имеются в виду всё-таки не произвольные и не динамически генерируемые, а заранее вписанные в ini, свои для каждого скрипта в его секции.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Да, поля задаются только конфигурационным файлом. Поле - одно на каждый скрипт. А по условию - это какая-то морока получится. Вдруг кто-то захочет видеть сразу несколько колонок в одном месте. Удобнее все-таки иметь возможность делать несколько полей.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

В данный момент плагин поддерживает 10 колонок, или я чего-то недопонял.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

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

Сообщение Batya »

MVV писал(а):Поле - одно на каждый скрипт.
Меня, конечно, игнорируют, но я выскажусь, что мне не нравится концепция - для каждого поля по скрипту.
Во-первых, это заставит плодить скрипты.
Во-вторых, результат некоторых полей может быть весьма похожим, и нет смысла размножать одинаковую логику.
Ну и наконец, результаты некоторых полей могут зависеть друг от друга. Тогда опять приходим к умножению одинаковых сущностей.

Подумайте, как, например, при новой логике может быть реализован вот этот вариант.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Новый скриптик:

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

'=================================================
' Колонка Result возвращает владельца файла\папки
'=================================================

content = Result

Function Result
  On Error Resume Next
  Dim wmiSecSettings 'WMI объект для параметров безопасности
  Dim wmiSecurityDescriptor 'Дескриптор защиты файла

  Dim FOResult 'Результат выполнения операции чтения дескриптора безопасности
  Dim wmiOwner 'Объект владельца файла

  Set wmiSecSettings = GetObject ("winmgmts:Win32_LogicalFileSecuritySetting.path='" & filename & "'") 'Создание WMI объекта файла

  FOResult = wmiSecSettings.GetSecurityDescriptor(wmiSecurityDescriptor) 'Считывание дескриптора безопасности
  Set wmiOwner = wmiSecurityDescriptor.Owner 'Создание объекта владельца файла

  If Err.Number <> 0 Then 'Ошибка при определении владельца файла
    Result = "Can't get file owner. Error: " & Err.Description
  Else 'Владелец файла определен - вывод результата
    Result = wmiOwner.Domain & "\" & wmiOwner.Name
  End If
End Function
Нет, я не сплю. Я просто медленно моргаю.
vsz
Сообщения: 1
Зарегистрирован: Чт ноя 18, 2010 16:58

Путь к ini-файлу

Сообщение vsz »

Здравствуйте!
Обнаружил проблему с использованием плагина в Portable установке. Подозреваю, что плагин не может найти свой ini-файл.

Как вариант можно всегда брать ini-файл в той же папке, где находится и сам файл плагина:

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

uses Windows;

function GetModuleFileNameStr: String;
 var
	buffer : array [0..MAX_PATH] of Char;
 begin
	GetModuleFileName( Hinstance, buffer, MAX_PATH);
	Result := buffer;
 end;

iniPath := ExtractFilePath(GetModuleFileNameStr);
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

можно всегда брать ini-файл в той же папке, где находится и сам файл плагина
Плагин всегда берёт ini-файл в той же папке, где находится и сам файл плагина.
Никакого другого поведения я не закладывал.
Подозреваю, что плагин не может найти свой ini-файл.
Когда плагин не может найти свой ini-файл он пишет - No script or ini file, снимая этим все подозрения.
Ответить