Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> LuaPosh в пилоте., Новые возможности пилота
Fors1k
сообщение 23.3.2020, 18:20
Сообщение #1


*****

Journeyman
Сообщений: 328
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1526
Пользователь №: 18.746
Возраст: 26



Совет:
Распаковать рядом с exe пилота.
v.2 Прикрепленный файл  luaposh_v2.rar ( 1,88 килобайт ) Кол-во скачиваний: 14
Совет:
Распаковать рядом с exe пилота.
v.1 Прикрепленный файл  luaposh.rar ( 1010 байт ) Кол-во скачиваний: 17

Написал модуль для возможности писать на PoSh прямо из пилота.

Можно писать одновременно как на lua, так и на PoSh внутри одного скрипта.

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

Примеры компактности языка:
№1
задача
Цитата(FREEON @ 17.2.2020, 15:38) *

Вот еще задачка. нужно найти все комментарии однострочные и многострочные, но данная регулярка не совсем корректно находит многострочные комментарии. Всего комментариев 7(для наглядности в тексте примера их пронумеровал и отметил жиром) из них: 5 однострочных и 2 многострочных
Вот рег: <!--(.+|(.|\s)*)-->
Вот пример текста:
<!--1 однострочный коментарий-->
текст <!-- 2 Это -- комментарий -->
текст
<!-- 3 многострочный
коментарий
текст какой-то-->
текст
Эт0
к0д
какой-то
<!-- 4
это еще один
ногострочный
коментарий
-->
текст
<!-- 5 это считается коментарием <!-- и это коментарием --> а этот текст уже нет-->
<!-- 6 --><!--7-->


Решение на Pilot (только для Ansi, так как с utf pilot не работает вовсе)

Код
log clear_current
log mode compact
load_array %a C:\1.txt
for #i 1 size(%a)
    set $a %a[#i]
    while regexp(#p $r $a <!--.*?(-->|$))
        log $r
        while copy($r eval(size($r)-2) 3) != -->
            set #i #i + 1
            set $a %a[#i]
            if regexp(#p $r $a ^.*?-->)
                log $r
                break
            end_if
            log %a[#i]
        end_while
        set $a string_replace($a $r "")
    end_while
end_for
log save_current C:\2.txt
end_script

Решение на lua

Код
--lua
log "clear"  log "mode compact"
package.path = "LuaPlugins\\winapi\\?.lua;" .. package.path
package.path = "LuaPlugins\\?.lua;" .. package.path
setfenv(1, require'winapi')
require'utf8'

local s = readfile([[C:\1.txt]])  
local f2 = io.open([[C:\2.txt]], "wb")

if s and f2 then  

        for w in s:gmatch("<%!%-%-.-%-%->") do  
            log (w .. "\r\n")
            f2:write(w .. "\r\n")
        end
        f2:close()  
end

exec ("notepad.exe", [[C:\2.txt]])

end_script ()


Решение на LuaPoSh. Сам код на ps занимает всего одну строку.
Исходная кодировка текста может быть как юникод, так и Ansi.
Код
--lua
require "LuaPoSh"
PScode('void',{[[#}

[regex]::Matches((Get-Content C:\1.txt), '<!--.+?-->').value > C:\2.txt;C:\2.txt

]]})

№2
задача
Цитата(neves @ 15.3.2020, 15:57) *

Hello everyone. I have a problem with showwindow() state commands.
In the wiki page are given only these states:
Код
HIDE: спрятать окно
MAXIMIZE: развернуть во весь экран
MINIMIZE: свернуть
RESTORE: развернуть
SHOW: показать
TOP: вытащить на поверхность.

My question is: Are there any other states which I can use, because none of these worked for my problem?
I am trying to minimize and restore given window in windows 10 virtual desktops, without switching between the desktops automatically. I need more like a popup state. When I use RESTORE or MAXIMIZE state, it switches to the virtual desktop where the window is located automatically.


Решение на lua

Код
--lua
package.path = "LuaPlugins\\winapi\\?.lua;" .. package.path
package.path = "LuaPlugins\\glue\\?.lua;" .. package.path
setfenv(1, require'winapi')
require[[winapi.winuser]]

local ffi = require("ffi")
ffi.cdef[[
BOOL ShowWindow(int hWnd, int nCmdShow);
]]

local SW_SHOWNOACTIVATE =  4


hndl=findwindow ("Калькулятор")

C.ShowWindow(hndl[1][1], SW_SHOWNOACTIVATE)


Решение на LuaPoSh. Сам код на ps занимает всего три строки.
Код
--lua
require "LuaPoSh"
hndl=findwindow ("Калькулятор")
PScode('void',{[[#}

$sig='[DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);';
$winapi=add-type -memberd $sig -name "win32showwindowasync" -namespace win32functions -pass;
$winapi::showwindowasync([int]$input, 4)

]]},hndl[1][1])


Также на PoSh можно создавать задачи в планировщике, редактировать word/excel документы, читать excel по строкам, столбцам, книгам, менять значения в реестре, можно использовать классы и методы .Net, писать в нем на c#...в общем всего не перечислить, а большинство повседневных задач решаются в паре строчек кода.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 23.3.2020, 18:41
Сообщение #2


*****

Journeyman
Сообщений: 328
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1526
Пользователь №: 18.746
Возраст: 26



Синтаксис:
Код
PScode('return/void',{[[#}

#pscode;
#pscode

]]},<arg1>,<arg2>,<arg3>)

Цитата
return? - 'void', если нам нужно просто выполнить действия ; 'return' - если нам нужно вернуть результат выполненных действий.
pscode; - сам код на PoSh.
arg - данные, передаваемые PoSh коду из Lua. Для arg1 сделал возможность принимать массивы.
Внутри PScode зарезервированы следующие переменные:
$return ; $input ; $input1 ; $input2


Пример использования return:
Получим список процессов
Код
--lua
require "luaposh"
res=PScode('return',{[[#}

$return=get-process

]]})
log(res)


Пример использования input:
15/4
Код
--lua
require "luaposh"
local a, b = 15, 4
res=PScode('return',{[[#}

$return=$input / $input1

]]},a,b)
log(res)


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 24.3.2020, 20:46
Сообщение #3


*****

Journeyman
Сообщений: 345
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 2001
Пользователь №: 18.346
Возраст: 25



Прыыыкона.
Ток пытался погуглить чо за Lua Posh список команд посматреть да примеры какие но толком ничего не нашол
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 24.3.2020, 21:36
Сообщение #4


*****

Journeyman
Сообщений: 328
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1526
Пользователь №: 18.746
Возраст: 26



Цитата(FREEON @ 24.3.2020, 20:46) *
Прыыыкона.
пытался погуглить чо за Lua Posh
Цитата(Fors1k @ 23.3.2020, 18:20) *
Написал модуль для возможности писать на PoSh прямо из пилота.

Я только вчера его создал, так что гугл про него пока не в курсе ))

Цитата(FREEON @ 24.3.2020, 20:46) *
примеры какие ..

Ну что бы не придумывать их из головы, я для примеров просто брал задачи от пользователей на нашем форуме из недавних тем.
Вот тогда еще один пример.
Задача
Цитата(portos @ 5.3.2020, 1:45) *

1.txt - 81 351920450784
2.txt - 81 109.248.51.148 24531 aaaaaa 2bb2bbb2b
3.txt - 81 Mozilla/5.0 (Linux; Android 4.0; F3555 Build/23.2.B.4.70) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.362
результат
4.txt - 351920450784:nnnnnn|109.248.51.148:24531:aaaaaa:2bb2bbb2b|Mozilla/5.0 (Linux; Android 4.0; F3555 Build/23.2.B.4.70) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.362

из 1.txt берём номер (351920450784) добавляем : двоеточие и слово (оно одинаково во всех строках)
знак |
из 2.txt берём 109.248.51.148 24531 aaaaaa 2bb2bbb2b (вместо пробелов ставим : )
знак |
из 3.txt берём Mozilla/5.0 (Linux; Android 4.0; F3555 Build/23.2.B.4.70) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.362

и так по порядку все строки (81 это номер строки)

Решение на lua
Код
--lua
package.path = "LuaPlugins\\winapi\\?.lua;" .. package.path
package.path = "LuaPlugins\\?.lua;" .. package.path
setfenv(1, require'winapi')
require'utf8'

local f1, f2, f3 = {}, {}, {}
for s in string.gmatch(readfile([[C:\1.txt]]), "[^\r\n]+") do
table.insert(f1, s)end
for s in string.gmatch(readfile([[C:\2.txt]]), "[^\r\n]+") do
table.insert(f2, s)end
for s in string.gmatch(readfile([[C:\3.txt]]), "[^\r\n]+") do
table.insert(f3, s)end
local f4 = io.open([[C:\4.txt]], "wb")

if f1 and f2 and f3 and f4 then
    -- чтение файлов в массивы
    local arr1, arr2, arr3 = {}, {}, {}
    for i=1,#f1 do arr1[#arr1+1] = f1[i]:match("%d+%s+(.+)") end
    for i=1,#f2 do arr2[#arr2+1] = string.gsub(f2[i]:match("%d+%s+(.+)"), " ", ":") end
    for i=1,#f3 do arr3[#arr3+1] = f3[i]:match("%d+%s+(.+)") end

    local min = math.min (#arr1, #arr2, #arr3)
    for i = 1, min do     -- запись в файл
        f4:write(arr1[i])
        f4:write(":nnnnnn|")
        f4:write(arr2[i])
        f4:write("|")
        f4:write(arr3[i])
        f4:write("\r\n")
    end
    f4:close()  -- закрыть файл

    exec ("notepad.exe", [[C:\4.txt]])
else
    log ("Какой-то из файлов не открылся или не найден")
end

Решение на LuaPoSh
Код
--lua
require "luaposh"
PScode('void',{[[#}

for($i = 0;$i -lt (Get-Content C:\1.txt).count;$i++){#}
    $res+= [regex]::Matches(((Get-Content C:\1.txt)[$i]), '(?<=\w\s).+').value+":nnnnnn|";
    $res+=([regex]::Matches(((Get-Content C:\2.txt)[$i]), '(?<=\w\s).+').value -replace " ",":")+"|";
    $res+= [regex]::Matches(((Get-Content C:\3.txt)[$i]), '(?<=\w\s).+').value;
    $res >>C:\4.txt;$res=$null
}C:\4.txt

]]})


Описывай свою задачу, или задавай, какие есть, вопросы, постараюсь дать ответ. А список всех команд есть на msdn.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 27.3.2020, 14:10
Сообщение #5


****

Apprentice
Сообщений: 280
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 233
Пользователь №: 18.689



Как он может решить задачу findcolor/findimage?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.3.2020, 14:13
Сообщение #6


**********

Elder
Сообщений: 2.764
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 17725
Пользователь №: 16.971
Возраст: 29



Цитата
Как он может решить задачу findcolor/findimage?

Никак. Таких функции у винды нет.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 27.3.2020, 15:43
Сообщение #7


*****

Journeyman
Сообщений: 328
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1526
Пользователь №: 18.746
Возраст: 26



Цитата(Levo222 @ 27.3.2020, 14:10) *

Как он может решить задачу findcolor/findimage?

Зачем ему решать эти задачи, если они уже решены в пилоте?)

Цитата(Fors1k @ 23.3.2020, 18:20) *
Можно писать одновременно как на lua, так и на PoSh внутри одного скрипта.

Вот поиск цвета для примера №1.

Выгрузить все комментарии из файла, если появится цвет.
Код
--lua
require "luaposh"

if color (336, 42, 3870786 ) == 16777215 then
PScode('void',{[[#}

[regex]::Matches((Get-Content C:\1.txt), '<!--.+?-->').value >C:\2.txt

]]})
End


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 30.3.2020, 18:48
Сообщение #8


*****

Journeyman
Сообщений: 328
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1526
Пользователь №: 18.746
Возраст: 26



LuaPosh V2
  • Добавил prompt. Вроде того, что был на пилоте. Пока только текстовое поле.
    Прикрепленное изображение
    text_prompt "Text:"

    Запрос на ввод значения для примера №1.
    Код
    --lua
    require "LuaPoSh"
    PScode('void',{[[#}

    [regex]::Matches((Get-Content (text_prompt "Путь к исходнику:")), '<!--.+?-->').value >(text_prompt "Куда сохранить?")

    ]]})
    Совет:
    Имейте в виду, что путь для сохранения будет запрошен первым, хоть и находится в конце кода. Что бы избежать ошибок, не стоит использовать одинаковые подсказки для prompt( или смотрите следующий пример).
    [regex]::Matches(Get-Content (text_prompt "Путь:"), '<!--.+?-->').value >(text_prompt "Путь:")

    В следующем примере введеные данные из запроса сначала будут занесены в переменные.
    Кстати, при такой записи мы точно знаем порядок запросов, и можем использовать одинаковые подсказки.
    Код
    --lua
    require "LuaPoSh"
    PScode('void',{[[#}

    $pathIN= text_prompt "Путь:"
    $pathOUT=text_prompt "Путь:"
    [regex]::Matches((Get-Content $pathIN), '<!--.+?-->').value >$pathOUT

    ]]})

    Можно в любом месте скрипта просто сделать запрос данных для дяльнейшего использования.
    Код
    --lua
    require "luaposh"
    -- код
    a=PScode('return',{[[#}$return=text_prompt]]})
    log(a)
    -- код
    -- В переменной a находятся введенные данные.


  • Добавил возврат информации об ошибке. По умолчанию возвращаются только прерывающие ошибки.
    Например, проверим, запущен ли калькулятор, но допустим ошибку в имени команды.
    Цитата
    --lua
    log "clear"
    require "luaposh"
    Calc=PScode('return',{[[#}

    if(Get-PrUocess win32calc){$return=$true}
    else{$return=$false}

    ]]})
    log(Calc)

    В ответ получим:
    Код
    Get-PrUocess : Имя "Get-PrUocess" не распознано как имя командлета, функции, файла сценария или выполняемой программы. 
    Проверьте правильность ...
    Теперь сразу понятно где надо исправить опечатку.


  • Булен будет возвращаться как string со значениями 'true' или 'false'.
    Код
    --lua
    require "luaposh"
    Calc=PScode('return',{[[#}

    if(Get-Process win32calc){$return=$true}
    else{$return=$false}

    ]]})
    if Calc=='true' then
        log("Калькулятор запущен!")
    end
Архив с обновлением в первом посте.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 10.4.2020, 21:54
Designed by Nickostyle