Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ LuaPosh

Автор: Fors1k 23.3.2020, 18:20

Установка:

Написал модуль для возможности писать на 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";PScode('void',{[[#}
#
WinApi ShowWindow([int]$input, 4)
#
]]}, findwindow("Калькулятор")[1][1])

№3
задача
Цитата(portos @ 3.9.2020, 14:41) *

в папке D\3 находятся папки с фото,нужно оставить только файлы jpg которые больше 100х100 пикс


Решение на lua

Код
--lua
local ffi = require('ffi')
local gdip = ffi.load('Gdiplus.dll')
local CP_ACP = 0

ffi.cdef[[
typedef unsigned int  UINT;
typedef unsigned long DWORD;
typedef struct {UINT GdiplusVersion; int DebugEventCallback; bool SuppressBackgroundThread; bool SuppressExternalCodecs;} GdiplusStartupInput, *pGdiplusStartupInput;

bool DeleteFileA(const char *lpFileName);
int GdiplusStartup(int *token, pGdiplusStartupInput GdiplusStartupInput, int *output);
int GdiplusShutdown(int token);
int GdipDisposeImage(int image);
int GdipLoadImageFromFile(const wchar_t *filename, int *image);
int GdipGetImageWidth(int image, UINT *width);
int GdipGetImageHeight(int image, UINT *height);
int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, const char *lpMultiByteStr, int cbMultiByte, wchar_t *lpWideCharStr, int cchWideChar);
]]

function image_size(path)
    local buf = ffi.new('wchar_t[?]', #path+1)
    local StartupInput = ffi.new('GdiplusStartupInput', {1, 0, 0, 0})
    local token, image, w, h = ffi.new('int[1]'), ffi.new('int[1]'), ffi.new('int[1]'), ffi.new('int[1]')
    ffi.C.MultiByteToWideChar(CP_ACP, 0, path, #path, buf, ffi.sizeof(buf))
    gdip.GdiplusStartup(token, StartupInput, nil)
    gdip.GdipLoadImageFromFile(buf, image)
    gdip.GdipGetImageWidth(image[0], w)
    gdip.GdipGetImageHeight(image[0], h)
    gdip.GdipDisposeImage(image[0])
    gdip.GdiplusShutdown(token[0])
    return w[0], h[0]
end

log 'clear' log 'mode compact'

local path = [[D:\3]]      -- путь к папке

local resultarray, count = dir (path, "*.bmp;*.jpg")  -- получить список всех файлов в формате bmp и jpg
log ("Найдено файлов: " .. count)

if count then      -- если файлы найдены
    for i=1, #resultarray do
        local width, height = image_size( resultarray[i][1] )
        log(resultarray[i][1].. '\tШирина: ' .. tostring(width) .. '\t'.. 'Высота: ' .. tostring(height))  -- размеры картинки
        if width < 100 and height < 100 then   -- если ширина и высота меньше 100
            ffi.C.DeleteFileA( resultarray[i][1] )  -- удалить файл
        end
    end
end
local resultarray, count = dir (path, "*.?*")  -- получить список всех файлов
log ("Найдено файлов: " .. tostring(count))
if count then      -- если файлы найдены
    for i=1, #resultarray do
        if  resultarray[i][4] ~= '.jpg' then     -- если не jpg
            log('Удаление файла: ' .. resultarray[i][1])
            ffi.C.DeleteFileA( resultarray[i][1] )  -- удалить файл
        end
    end
end


Решение на LuaPoSh. Сам код на ps в 5 раза короче и проще, чем на lua.
--lua
require "LuaPoSh";PScode('void',{[[#}
#
$path = 'D:\3'
function Check-PicSize($p){#}
$img = [Drawing.Image]::FromFile( $p.fullname )
if($img.width -gt 100 -and $img.Height -gt 100)
{$img.Dispose(); $true}else{$img.Dispose(); $false}
}
Get-ChildItem $path -file -rec|ForEach{#}
if(!($_.Extension -eq '.jpg' -and (Check-PicSize $_)))
{ri $_.FullName}
}
#
]]})


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


Прикрепленные файлы
Прикрепленный файл  LuaPosh.rar ( 14,29 килобайт ) Кол-во скачиваний: 80

Автор: Fors1k 23.3.2020, 18:41

Синтаксис:

Код
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";log "clear";log "mode compact"
res = PScode('return',{[[#}
#
$return=get-process
#
]]})

log(res)


Пример использования input:
15/4
--lua
require"luaposh";log "clear";log "mode compact"
a
, b = 15, 4
res = PScode('return',{[[#}
#
$return=$input / $input1
#
]]},a,b)

log(res)

Автор: FREEON 24.3.2020, 20:46

Прыыыкона.
Ток пытался погуглить чо за Lua Posh список команд посматреть да примеры какие но толком ничего не нашол

Автор: Fors1k 24.3.2020, 21:36

Цитата(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";log "clear";log "mode compact"
PScode('return',{[[#}
#
$1=Gc C:\1.txt;$2=Gc C:\2.txt;$3=Gc C:\3.txt
for($i = 0;$i -lt $1.count;$i++){#}
$res+= [regex]::Matches($1[$i], '(?<=\w\s).+').value+":nnnnnn|"
$res+=([regex]::Matches($2[$i], '(?<=\w\s).+').value -replace " ",":")+"|"
$res+= [regex]::Matches($3[$i], '(?<=\w\s).+').value
$res >> C:\4.txt;$res=$null
}C:\4.txt
#
]]})


Описывай свою задачу, или задавай, какие есть, вопросы, постараюсь дать ответ.
Цитата(FREEON @ 24.3.2020, 20:46) *
список команд посматреть

https://docs.microsoft.com/ru-ru/powershell/module/microsoft.powershell.management/?view=powershell-5.1

Автор: Levo222 27.3.2020, 14:10

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

Автор: cirus 27.3.2020, 14:13

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

Никак. Таких функции у винды нет.

Автор: Fors1k 27.3.2020, 15:43

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

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

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

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

Вот поиск цвета для примера https://forum.uokit.com/index.php?s=&showtopic=70167&view=findpost&p=436576.

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

if color( 336423870786 ) == 16777215 then
PScode('void',{[[#}
#
[regex]::Matches((Get-Content C:\1.txt), '<!--.+?-->').value >C:\2.txt
#
]]})
end

Автор: Fors1k 30.3.2020, 18:48

LuaPosh V2

Автор: Fors1k 13.4.2020, 1:21

LuaPosh V3

  1. Цитата(Levo222 @ 27.3.2020, 14:10) *
    Как он может решить задачу findcolor/findimage?

    Теперь вот так
    --lua
    log"clear";log"mode compact";require "luaposh"
    PScode('return',{[[#}
    #
    $startX,$startY,$endX,$endY = 0, 0, 1920, 1080 # Координаты
    $color=14811135 # цвет
    $window=5772790 # хэндл окна

    while($arr.Count -lt 1 -and (on)){#} # Цикл поиска
    $arr=lua @"
    workwindow($window)
    local a = findcolor($startX, $startY, $endX, $endY, 1, 1, '(' .. $color .. ')', "%arr", 2, 1)

    reposh(arr) -- вернуть arr (return)
    "@

    }

    $x,$y=$arr[0][0],$arr[0][1]
    lua "move($x, $y)" # Переместить курсор в найденную точку
    #
    ]]})

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

  2. Подключил вывод консоли напрямую к логу. Раньше данные можно было получить только после окончания
    работы блока pscode, теперь же можно получать сразу через команду log.
    Пример:
    --lua
    log"clear";log"mode compact";require "luaposh"
    PScode('return',{[[#}
    #
    $Processes=Get-Process # Получить список процессов
    log $Processes # Вывести список в лог
    #
    ]]})

    --lua
    log"clear";log"mode compact";require "luaposh"
    PScode('return',{[[#}
    #
    $dir=Get-ChildItem C:\ # Запросить содержимое диска
    log $dir # Вывести в лог
    #
    ]]})

    В следующем примере показано как можно получить ошибки предыдущих команд
    --lua
    log"clear";log"mode compact";require "luaposh"
    PScode('return',{[[#}
    #
    $dir=Get-ChildItem T:\ # Запросить содержимое диска
    $dir=Get-ChildItem R:\ # Запросить содержимое диска
    log # Запросить ошибки
    #
    ]]})

    В логе:
    Цитата
    Get-ChildItem : Не удалось найти диск. Диск с именем "R" не существует.
    ...
    + CategoryInfo : ObjectNotFound: (R:String) [Get-ChildItem], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

    Get-ChildItem : Не удалось найти диск. Диск с именем "T" не существует.
    ...
    + CategoryInfo : ObjectNotFound: (T:String) [Get-ChildItem], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

  3. Добавил определение статуса нажатых клавиш.
    Пример ожидания клика левой кнопкой мышки. Запустите скрипт, подождите, и потом кликните мышкой в любое место.
    --lua
    log"clear";log"mode compact";require "luaposh"
    PScode('return',{[[#}
    #
    Get-KeyState 1
    while(!(Get-KeyState 0x01) -and (on)){sleep -m 100} # Ожидаем клик ЛКМ
    #
    ]]})

    msg
    ("Хватит кликать!")

  4. В posh есть доступ к WinApi. Добавил возможность быстрого обращения к функциям.
    • Сместить курсор на 500 вправо, и на 230 вверх
    --lua
    log"clear";log"mode compact";require "luaposh"
    PScode('void',{[[#}
    #
    WinApi mouse_event(1, 500, -230, 0, 0)
    #
    ]]})
    Параметры:
    -returnType bool по умолчанию
    -dllName user32.dll по умолчанию


  5. Для корректного отображения таблиц в логе, нужно открыть настройки пилота-> Выбрать шрифт лога-> Lucida Console.
    Для каждого цикла в конце добаляйте условие (on). Это видно в примерах данного поста. Это нужно для того, что бы цикл останавливался, если вы нажали стоп в пилоте.
Архив с обновлением в первом посте.

Автор: Fors1k 14.4.2020, 1:16

Дополнение к V3

Отображение текста(и не только) в любом месте экрана.
Автор дополнения cirus
Пример:

--lua
require'LuaPoSh'
PScode('void',{[[luaposhhint]]})
local HNDL=tbhndl()
local x = 0

-- выполнять данный блок 5 секунд
local time = os.clock() + 5
while os.clock() < time do
drawtext(HNDL'x = ' .. tostring(x) .. '\r\n.. 'Текст'20010036'Arial'65280255)
x = x + 1
drawtext(HNDL'Текст\r\nМногострочный'7030048'Segoe Print'6527916000000)
drawtext(HNDL'Text 123 qwerty\r\nЕще текст\r\nи ещё' 40015024'Comic Sans MS'2550)
wait (10)
end
text_close() -- Закрыть luaPoshHint

Демонстрация:Прикрепленное изображение

Функция drawtext принимает параметры:
Цитата
1. Хендл окна, на которое выводить текст.
2. Строка, которую нужно отобразить.
3. Координата X.
4. Координата Y.
5. Размер шрифта.
6. Имя шрифта.
7. Фон текста.
8. Цвет текста.

Автор: Levo222 14.4.2020, 11:49

Ладно. С многопоточкой твой LuaPosh точно не справится)

Автор: cirus 14.4.2020, 11:59

Цитата
С многопоточкой твой LuaPosh точно не справится

Она и не нужна, таймеры пригодились бы...

Автор: Fors1k 14.4.2020, 15:52

Цитата(cirus @ 14.4.2020, 11:59) *

таймеры пригодились бы...

Да я думаю можно будет сделать)
Цитата(Levo222 @ 14.4.2020, 11:49) *

С многопоточкой твой LuaPosh точно не справится)

С чего такие предположения?)

Автор: Fors1k 14.4.2020, 16:42

Дополнение к V3

И еще одна новинка. Вывод части изображения выбранного окна поверх всех окон.
Окно может быть перекрыто (но, не свёрнуто) или быть на другом рабочем столе.
Автор дополнения cirus
Пример:

демонстрация
Изображение
--lua
require'LuaPoSh'
PScode('void',{[[luaposhhint]]})
local HNDL=tbhndl()

local handle = findwindow ("Калькулятор")   -- окно, с которого нужно отобразить на экране часть изображения

if handle then -- если окно найдено
while true do
        visualwindow(HNDLhandle[1][1], 00300250200100100)
        -- HNDL хендл окна, куда выводить изборажение
        -- handle[1][1] - хендл окна откуда получать изображение
        -- 0, 0, 300, 250 - относительные координаты, с которых будет получено изображение
        -- 200, 100 - абсолютные координаты вывода изображения на экран
        -- 100 - масштаб вывода в процентах (изображение будет сжато или растянуто если не 100%)
        wait(10)
end
else
log ("Окно не найдено")
end

Автор: Fors1k 17.4.2020, 18:47

LuaPosh V4
Добавил таймеры. Таймер выполняет заданный код через определенные интервалы времени.


В следующем примере представлен скрипт с тремя "потоками".
Первый следит за кликами левой кнопкой миши.
Второй следит за нажатием на пробел.
Третий - основной поток, он просто считает.
--lua
log "clear";require "luaposh"
PScode('return',{[[#}
#
Get-KeyState 0x01 # пропускаем клик при запуске скрипта

# Поток 1
Start-Timer @"
if ((Get-KeyState 0x01)){#} # отслеживаем нажатие левой кнопки мыши
msg_box "Нажата левая кнопка мыши" # действия таймера
log "ЛКМ" # действия таймера
}
"@
500 # интервал выполнения 500 ms

Get-KeyState 0x20 # пропускаем пробел, нажатый до запуска

# Поток 2
Start-Timer @"
if ((Get-KeyState 0x20)){#} # отслеживаем нажатие пробела
msg_box "Нажат пробел" # действия таймера
log "ПРОБЕЛ" # действия таймера
}
"@
500 # интервал выполнения 500 ms
# Основной поток
while((on)){#}
log ("Я просто считаю: "+$i++)
sleep -m 250
}
#
]]})
Добавлен вывод сообщений на экран. Msg_box "text"



Архив с обновлением в первом посте.

Автор: Fors1k 18.4.2020, 14:07

Демонстрация вывода данных в лог

ping.exe
Изображение


Кстати, если команде log передать вторым параметром "1", это поможет визуально отделить одни данные от других.
--lua
log"clear";log"mode compact";require"luaposh"
PScode('return',{[[#}
#
log (ping ya.ru) 1
log (ping uokit.com)
#
]]})

Автор: Fire73 21.4.2020, 18:21

Доброго времени суток!

Подскажите, как с его помощью получить из файла все слова, которые начинаются на "@"?

Автор: Fors1k 21.4.2020, 18:43

Цитата(Fire73 @ 21.4.2020, 18:21) *
Подскажите, как с его помощью получить из файла все слова, которые начинаются на "@"?

--lua
log"clear";log"mode compact";require"luaposh"
PScode('return',{[[#}
#
$path = "C:\1.txt"
log ([regex]::Matches((Get-Content $path), '@\S+').value)
#
]]})

Автор: Fire73 21.4.2020, 19:28

Цитата(Fors1k @ 21.4.2020, 19:43) *

Код
--lua
log"clear";log"mode compact"
require"luaposh";PScode('return',{[[#}

$path= "C:\1.txt"
log ([regex]::Matches((Get-Content $path), '@\S+').value)

]]})



Отлично. То, что надо)

Автор: Fors1k 23.4.2020, 20:54

Небольшие изменения и исправления.



Архив с обновлением в первом посте.

Автор: Fire73 6.6.2020, 18:09

Дано:
89997001234:Forsik007:Алла Пугачева:uopilot@mail.ru:zdarovabanditi

Нужно с помощью регулярного выражения найти : 1234, Forsik007, uopilot@mail.ru и записать в переменные.



Автор: Fors1k 6.6.2020, 18:36

Благодаря команде split, мы можем обойтись без постройки сложных паттернов регэкспа.

--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$str ="89997001234:Forsik007:Алла Пугачева:uopilot@mail.ru:zdarovabanditi" -split ':'
$num =($str[0]).Substring(7,4)
$id =$str[1]
$mail=$str[3]

log $num, $id, $mail
#
]]})

Кстати, данная строка похожа на инфо о каком-то клиенте/заказчике и т. п.. Если планируется обрабатывать много таких строк, то будет классно создать объект клиента, в котором и будут все его данные. А в итоге вообще можем их всех сохранить в excel файл.
Например, вот так:
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$pathOut='C:\test\baza.csv'

$str ="89997001234:Forsik007:Алла Пугачева:uopilot@mail.ru:zdarovabanditi" -split ':'
$str1 ="88887774321:Bond007:Филипп Киркоров:philpilot@gmail.ru:privetbanditi" -split ':'
$clientALLA=@{#}
num
=($str[0]).Substring(7,4)
id
=$str[1]
mail
=$str[3]
}
$clientPHIL=@{#}
num
=($str1[0]).Substring(7,4)
id
=$str1[1]
mail
=$str1[3]
}
$Base=($clientALLA,$clientPHIL)
# Показать в логе Аллу*
log $clientALLA
# Показать в логе только mail Аллы
log $clientALLA.mail
# Сохранить базу в Excel таблицу
$base|%{[pscustomobject]$_| export-csv $pathOut -not -enc utf8 -d ';' -A}
start $pathOut
#
]]})

* Не забываем, что нужно открыть настройки пилота, выбрать шрифт лога, Lucida Console.

Автор: Levo222 17.6.2020, 16:48

Цитата(Fors1k @ 23.3.2020, 22:20) *

Распаковать рядом с exe пилота.
v. 4.1 Прикрепленный файл luaposh_v4.1.rar ( 5,08 килобайт ) Кол-во скачиваний: 51

Архив битый
--Upd--
Вот это поворот)
Все версии архивов битые
Цитата
Совет:
Распаковать рядом с exe пилота.
v. 4 Прикрепленный файл luaposh_v4.rar ( 5,01 килобайт ) Кол-во скачиваний: 34
Совет:
Распаковать рядом с exe пилота.
v. 3 Прикрепленный файл luaposh_v3.rar ( 3,31 килобайт ) Кол-во скачиваний: 28
Совет:
Распаковать рядом с exe пилота.
v. 2 Прикрепленный файл luaposh_v2.rar ( 1,88 килобайт ) Кол-во скачиваний: 41
Совет:
Распаковать рядом с exe пилота.
v. 1 Прикрепленный файл luaposh.rar ( 1010 байт ) Кол-во скачиваний: 34


Как закончилось моё знакомство с LuaPoshk)))

Автор: Fors1k 17.6.2020, 17:54

Цитата(Levo222 @ 17.6.2020, 16:48) *
Архив битый

Что значит битый? У всех других открывается нормально.

Автор: Levo222 17.6.2020, 17:56

Цитата(Fors1k @ 17.6.2020, 21:54) *

Что значит битый? У всех других открывается нормально.

Я не другой. У меня всё через одно место. Перепробовал всеми архиваторами - не открывает.

Автор: Fors1k 17.6.2020, 18:17

Цитата(Levo222 @ 17.6.2020, 17:56) *
У меня всё через одно место.

Тогда в чем здесь вина моего архива?
Цитата(Levo222 @ 17.6.2020, 17:56) *
Перепробовал всеми архиваторами - не открывает.

Когда он не может открыть, то он что-то пишет. Например: неожиданный конец архива;файл поврежден.
Эту информацию он дает специально, что бы можно было понять что именно нужно исправить.

Автор: Levo222 17.6.2020, 19:17

Цитата(Fors1k @ 17.6.2020, 22:17) *

Тогда в чем здесь вина моего архива?

Когда он не может открыть, то он что-то пишет. Например: неожиданный конец архива;файл поврежден.
Эту информацию он дает специально, что бы можно было понять что именно нужно исправить.

Не удалось открыть файл как архив. 7-Zip/WinRar
luaposh_v4.1.rar: The archive is either in unknown format or damaged

Автор: Fors1k 17.6.2020, 20:49

Может именно rar не хочет открывать у вас.
[attachmentid=3303]

Автор: Fors1k 9.7.2020, 19:15

LuaPosh V5
  1. Добавил команду определения цвета в заданных координатах.

    Получить цвет в окне 202896, в координатах 442х101:
    --lua
    log"clear";log"mode compact";require"luaposh"
    PScode('void',{[[#}
    #
    $color=Get-Color 202896 442 101
    msg_box $color
    #
    ]]})

    Поиск цвета можно отправить в отдельный поток, а ваш скрипт в это время может заниматься другими делами:
    --lua
    log"clear";log"mode compact";require"luaposh"
    PScode('r',{[[#}
    #
    ### Поток 1
    Start-Timer @"
    if ((Get-Color 922556 34 16) -eq 16510950){#} # отслеживаем появление цвета 16510950
    msg_box "Цвет обнаружен" # действия таймера
    log "Цвет обнаружен" # действия таймера
    }
    "@
    500 # интервал выполнения 500 ms
    ### Поток 2
    Start-Timer @"
    if ((Get-KeyState 0x20)){#} # отслеживаем нажатие пробела
    msg_box "Нажат пробел" # действия таймера
    log "ПРОБЕЛ" # действия таймера
    }
    "@
    500 # интервал выполнения 500 ms
    ### Основной поток
    while((on)){#}
    log ("Я просто считаю: "+$i++) # действия основного потока
    sleep -m 450 # действия основного потока
    }
    #
    ]]})
  2. Повысил скорость общения uopilot и luaposh в 350 раз.

  3. Так как на форуме много раз поднималась тема защиты кода, сделал возможность шифрования скрипта. Кто планирует передавать свой скрипт, но хочет избежать копирования - обращайтесь. Скрипт будет запускаться только у того, у кого вы захотите.
    Поддерживаемые языки: Lua , LuaPosh.

  4. Проверить текущую версию:
    --lua
    log"clear";log"mode compact";require"luaposh"
    PScode('void',{[[version]]})

  5. Перезапустить LuaPosh:
    --lua
    require"luaposh"
    lp_restart
    ()
Обновление можно установить через апдейт. Если у кого возникнут сложности с апдейтом, в первый пост прикрепил архив.

Автор: Fors1k 15.7.2020, 15:13

Prompt с возможностью выбора вариантов.

Прикрепленное изображение

Совет:
check_prompt ("Вариант 1", "Вариант 2") "Подсказка"(необязательно)

Начнем со скучного примера, где мы сами задаем варианты, и не требуется использовать подсказку:
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$a = 1

$b = 2

$c = 7 + ( check_prompt ($a,$b) )
log $c
#
]]})


В этом примере нам пригодится возможность вывода подсказки перед запросом выбора.
Задача: Если получаем число меньше 50, то сохраним его в один файл, если больше 50, то в другой.
--lua
log "clear";log"mode compact";require "luaposh"
PScode('r',{[[#}
#
$path1 = "C:\маленькие числа.txt"

$path2 = "C:\большие числа.txt"

$number = Get-Random 100

$number|out-file (check_prompt ($path1, $path2) "Получилось число $number`. Куда его сохраним?")
#
]]})


Переходим к самому интересному примеру из представленных, в котором мы не будем сами задавать варианты выбора.
Задача: посмотреть список процессов, запущенных от имени какого-либо пользователя.
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$proc = Get-Process -IncludeUserName

$user = $proc.username|Sort-Object -Unique
$uProc = $proc|Where-Object username -eq (check_prompt $user "Выберите пользователя:")|ft -a
log $uProc
#
]]})

Если у кого-то будут еще идеи как можно интересно использовать такого вида prompt, то присылайте ваш код ниже, будет интересно посмотреть.

Автор: DarkMaster 20.9.2020, 8:51

Скорость работы этой либы отличается от скорости запуска PowerShell? Прошу понять правильно, просто зачастую я быстрее руками что-то сделаю, чем ждать запуска этой наковальни smile.gif

Автор: cirus 20.9.2020, 11:40

Долго первый запуск, потом нормально.

Автор: Fors1k 21.9.2020, 18:47

У меня старт занимает 1.73 сек. Поработаю еще над скоростью запуска.

Автор: Fors1k 28.9.2020, 1:33

LuaPosh V6

Диалоговое окно выбора файла.
Прикрепленное изображение

Прочитать файл, выбрав его в окне:
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$filePath = ShowDialog-FilePath

log $filePath
$data = Get-Content $filePath -Encoding UTF8
log $data
#
]]})


Диалоговое окно выбора папки.
Прикрепленное изображение

Удалить папку, выбрав её в окне:
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$folderPath = ShowDialog-FolderPath 'Что будем удалять?'

log $folderPath
Remove-Item $folderPath
#
]]})
Второй параметр-подсказка необязательный.


Синхронизация локальной папки с FTP.
Обновляет имеющиеся файлы.
Загружает отсутствующие.



Пример:
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$FtpPath = 'ftp://my.ftpurl.ru/docs/'
$LocalPath = 'C:\files\docs\'
$FtpLogin = 'john77'
$FtpPass = 'qwe123'

$Result = Sync-FtpFolder $ftpPath $localPath $FtpLogin $FtpPass
log $Result
#
]]})
Параметры $FtpLogin и $FtpPass не требуются, если сервер имеет открытый доступ.

Результат в логе:
Код
[1/3]scan.png
Files identical

[2/3]document.docx
FTP file newer
Downloaded

[3/3]test.txt
FTP file older
Uploaded

Автор: Fors1k 9.10.2020, 17:52

LuaPosh V7

Экранная лупа
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$color = Show-ScreenMagnifier

log $color
#
]]})
Верхний статус-бар отображает: цвет|координаты|масштаб.
Нижний статус-бар показывает цвет, который был определен под курсором.

Использование:
num+ = увеличить масштаб
num- = уменьшить масштаб
num0 = сбросить масштаб


Когда курсор наведен на нужный цвет, нажмите Esc. Лупа закроется, выбранный цвет будет записан в переменную.

Демонстрация:Прикрепленное изображение

Проверка ссылки на наличие вирусов:
--lua
log "clear";log"mode compact";require "luaposh"
PScode('return',{[[#}
#
$result = Check-UrlVirus yandex.ru

log $result
#
]]})


Автор: Fors1k 14.10.2020, 15:40

Добавлены параметры для экранной лупы.


-freezScreen

Замораживает экран. Пригодится если цвет, который вы хотите определить, меняется при наведении курсора.

-Clipboard
Выбранный цвет будет занесен в буфер обмена.

-rgb или -dec (без параметра будет Hex)
Задает формат определяемого цвета.

Автор: Fors1k 18.10.2020, 20:38

Поколдовал над запуском.

--lua
log "clear";log "mode compact";require"luaposh"
begin = os.clock()
PScode('return',{[[#}
#
log "Started"
#
]]})
finish = os.clock() - begin
log(finish)

На железе поколения DDR2 / Core 2 * результат 0.751. Полагаю, на всяких Core i* будет много быстрее.

Автор: Fors1k 22.12.2020, 0:33

Цитата(DarkMaster @ 3.10.2020, 18:20) *
Лично у меня пош стартует около 15 секунд.
Всё, наконец-то я с этим разобрался smile.gif

Выполняем один раз
--lua
require "luaposh"
PScode('void',{[[Install]]})
отныне пош будет стартовать мгновенно.

--lua
log "clear";log "mode compact";require"luaposh"
begin = os.clock()
PScode('return',{[[#}
#
log "Started"
#
]]})
finish = os.clock() - begin
log(finish)

Результат 0.341 shtanga.gif

Спасибо за настойчивость в данном вопросе, это подтолкнуло меня дожать эту тему wink.gif

Автор: Fors1k 25.12.2020, 15:17

LuaPosh V8

Selenium
Установка:
--lua
require"luaposh";log "clear";log "mode compact"
PScode('return',{[[#}
#
Install-Selenium

log
#
]]})
Пример задачи:
  1. Открыть яндекс
  2. Найти вики пилота
  3. Открыть вики
  4. Открыть страницу функции Exec
  5. Показать в логе описание функции
code
--lua
require"luaposh";log "clear";log "mode compact"
PScode('return',{[[#}
#
Start-Selenium

$luaFunction = 'Exec (Lua)'

$Chrome = Start-SeChrome
$Chrome.Url = 'https://ya.ru'
sleep 1
$Chrome.FindElementByName('text').SendKeys('uopilot')
sleep 1
$Chrome.FindElementByClassName('search2__button').click()
sleep 2
$Chrome.FindElementByPartialLinkText('uokit').click()
sleep 1
[void]$Chrome.SwitchTo().Window($Chrome.WindowHandles[1])
$Chrome.FindElementById('searchInput').SendKeys($luaFunction)
sleep 1
$Chrome.FindElementByName('go').click()
$description = $chrome.FindElementsByTagName('p')[0].text
log $description
#
]]})
демонстрация
Прикрепленное изображение
Слипы добавлены просто для возможности понаблюдать за происходящим.
Результат в логе:
Цитата
exec - запуск внешнего приложения. Не приостанавливает скрипт на время работы приложения. Для ожидания завершения используйте ExecAndWait (Lua). UoPilot запускать от администратора.

Для примера выше должен быть установлен Chrome browser.
Пишите, если что-то не будет работать. Буду исправлять.
Все его возможности пока не знаю, так что описывайте вашу задачу, постараюсь дать решение.

Автор: Fors1k 2.2.2021, 18:46

Тернарный оператор.

Синтаксис сделал обычный: boolean |?? если истина : если ложь

Если на часах 11 вечера, то пора идти спать:
--lua
log"clear";log"mode compact";require"luaposh"
PScode('return',{[[#}
#
$time = (Get-Date).Hour -eq 23 |?? "Пора спать" : "Еще не ночь"
log $time
#
]]})

В зависимости от времени суток будет запущено приложение:
--lua
log"clear";log"mode compact";require"luaposh"
PScode('void',{[[#}
#
(Get-Date).Hour -eq 23 |?? {Start "Calc"} : {Start "Notepad"}
#
]]})

Автор: Madeus 7.4.2021, 16:55

Как работает хайд и есть ли возможность хайдить другие процессы?

Код
--lua
log"clear";log"mode compact";require"luaposh"
PScode('void',{[[Hide-UoPilot]]})

Автор: Fors1k 7.4.2021, 17:39

Madeus, Hide-UoPilot прячет процесс пилота от защит, пытающихся его найти.
Насчет других процессов - да, можно. Но какие-то может быть и не получится, нужно будет тестить.

Сегодня или в ближайшие дни сделаю функцию для других процессов.

Автор: Fors1k 7.4.2021, 18:25

Набросал вот по-быстрому, попробуй.

--lua
log"clear";log"mode compact";require"luaposh"
PScode('void',{[[Start-HiddenProcess "C:\files\program.exe" "MySQL Service"]]})

Команда получилась длинноватой, так что сделал ей алиас. Вместо Start-HiddenProcess можно писать s-hp.

Автор: Madeus 7.4.2021, 18:39

Цитата(Fors1k @ 7.4.2021, 18:25) *

Набросал вот по-быстрому, попробуй.

Что-то не робит
Код
--lua
log"clear";log"mode compact";require"luaposh"
PScode('void',{[[Start-HiddenProcess "C:\Notepad++\notepad++.exe"]]})

Автор: Fors1k 7.4.2021, 18:49

Скачал notepad++, у меня получилось.

А, ну этой команде нужно передавать два параметра. Второй можно любой на свой вкус.

Вот так попробуй:

--lua
log"clear";log"mode compact";require"luaposh"
PScode('void',{[[Start-HiddenProcess "C:\Notepad++\notepad++.exe" "MySQL Service"]]})

Автор: Madeus 7.4.2021, 19:00

Цитата(Fors1k @ 7.4.2021, 18:49) *

А, ну этой команде нужно передавать два параметра. Второй можно любой на свой вкус.

Вот так попробуй:

Все так же, курс я понял, просто через powershell запускает

Автор: Fors1k 7.4.2021, 19:19

Цитата(Madeus @ 7.4.2021, 19:00) *

Все так же

Создаётся процесс с именем notepad++.exe?
У меня создаётся процесс с именем второго параметра. В данном случае MySQL Service.

Автор: Madeus 7.4.2021, 19:46

Цитата(Fors1k @ 7.4.2021, 19:19) *

Создаётся процесс с именем notepad++.exe?
У меня создаётся процесс с именем второго параметра. В данном случае MySQL Service.

Вообще не запускает

Решил проверить другие функции posh, чет вообще ничего не работает... позже буду разбираться

Вчера работало

Автор: Madeus 7.4.2021, 22:04

В общем нужна помощь) Вчера скачал - распаковал - обновил - установил.
Попробовал

Код
PScode('void',{[[Hide-UoPilot]]})
Перезапустился пилот.
Сегодня 0 реакции на любой скрипт связанный с posh. Ребут не помог.

Автор: Fors1k 8.4.2021, 1:31

Переустанови luaposh. Удали luaposh.lua и папку posh, распакуй зоново архив, и обновись через апдейт.
Поправил сокрытие процесса, теперь по идее проблем быть не должно.

Еще немного доработал, теперь вот так выглядит:
Прикрепленное изображение
Прикрепленное изображение

И Start-HiddenProcess теперь можно запускать с одним параметром - путь к файлу.

Автор: cirus 8.4.2021, 3:07

Цитата
Сегодня 0 реакции на любой скрипт связанный с posh.

Посмотри журнал антивирусника/защитника windows, нет ли там блокировки скриптов powershell.

Автор: Madeus 8.4.2021, 3:28

Цитата(Fors1k @ 8.4.2021, 1:31) *

Переустанови luaposh. Удали luaposh.lua и папку posh, распакуй зоново архив, и обновись через апдейт.
Поправил сокрытие процесса, теперь по идее проблем быть не должно.

Еще немного доработал, теперь вот так выглядит:
Прикрепленное изображение
Прикрепленное изображение

И Start-HiddenProcess теперь можно запускать с одним параметром - путь к файлу.

Помогло, в итоге пилот просто переименовывается? При чем если включено переименование в настройках то просто перезапускается. А старт процесса запускает приложение, но в диспетчере не переименовывается

Цитата(cirus @ 8.4.2021, 3:07) *

Посмотри журнал антивирусника/защитника windows, нет ли там блокировки скриптов powershell.

Журнал пустой

Автор: Fors1k 8.4.2021, 11:41

Цитата(Madeus @ 8.4.2021, 3:28) *
переименование в настройках
Это?
Прикрепленное изображение
Оно просто меняет имя окна, процесс так и остается uopilot.exe
Сейчас с пилотом получается как у меня на скрине?

Цитата(Madeus @ 8.4.2021, 3:28) *
А старт процесса запускает приложение, но в диспетчере не переименовывается
Блин, уже удалил notepad++, снова сейчас скачал, что бы затестить его запуск)
Вот запущенный notepad++:
Прикрепленное изображение
У тебя не так?

Автор: Madeus 8.4.2021, 13:45

Цитата(Fors1k @ 8.4.2021, 11:41) *

Это?
Прикрепленное изображение
Оно просто меняет имя окна, процесс так и остается uopilot.exe
Сейчас с пилотом получается как у меня на скрине?

Да, у меня всегда переименован exe пилота и в настройках тоже самое прописано, если стоит галочка переименовывать пилот то твой скрипт просто его перезапускает, если галочку убрать то работает как у тебя.
Цитата(Fors1k @ 8.4.2021, 11:41) *

Блин, уже удалил notepad++, снова сейчас скачал, что бы затестить его запуск)
Вот запущенный notepad++:
Прикрепленное изображение
У тебя не так?

Нет, у меня запускает с тем же именем что и всегда, notepad для примера, пробовал разное запускать. Из замеченного, в момент запуска exe того же notepad переименовывается "удаляется имя" потом стартует процесс, потом exe переименовывается обратно, в диспетчере при этом имя не меняется.

P.S. А есть варианты хайдить уже запущенный процесс?)

Автор: Fors1k 8.4.2021, 18:06

Notepad не получится так запустить, так как его владелец не пользователь, а trustedinstaller.
Убирать имя уже запущенного процесса - на сколько я знаю, невозможно.

Автор: dron4938 25.11.2021, 0:43

не нашел кнопки скачать)

Автор: yodich 18.12.2023, 23:12

Библиотека LuaPosh


Прикрепленные файлы
Прикрепленный файл  LuaPosh.rar ( 14,29 килобайт ) Кол-во скачиваний: 39

Автор: Deadly 27.12.2023, 9:29

Цитата(yodich @ 19.12.2023, 1:12) *
Библиотека LuaPosh

Прикрепили файл в начало темы.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)