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

 
Ответить в эту темуОткрыть новую тему
> Get my IPv4 and save into variable, Получите мой IPv4 и сохраните в переменной
neves
сообщение 30.9.2020, 23:14
Сообщение #1


***

Novice
Сообщений: 64
Регистрация: 4.10.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.419
Возраст: 19



Is it possible to get the current IPv4 and save it into variable?
I was thinking if its possible to do it using exec() function, something like that:
Код
--lua
local my_ip_address = exec([[ipconfig /all]])

, but sadly cannot save the result from exec() into variable.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 1.10.2020, 2:02
Сообщение #2


*****

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



Цитата(neves @ 30.9.2020, 23:14) *
Is it possible to get the current IPv4 and save it into variable?

Of course:
Код
--lua
require"luaposh"
myip = PScode('return',
{[[$return = (Get-NetAdapter|? status -eq ‘up’|Get-NetIPAddress -ea 0|? AddressFamily -eq IPv4).IPAddress]]})
log (myip)

If u use a router, and want to get an external IP:
Код
--lua
require"luaposh"
myip = PScode('return',{[[$return = ((iwr -useb freegeoip.app/json).Content|ConvertFrom-Json).ip]]})
log (myip)


Сообщение отредактировал DarkMaster - 3.10.2020, 19:08


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 1.10.2020, 3:48
Сообщение #3


**********

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



Код
--lua
log 'clear' log 'mode compact'
local handle = io.popen([[cmd.exe /c ipconfig /all]])
local result = handle:read("*a")
handle:close()

for ip in result:gmatch("IPv4.-(%d+%.%d+%.%d+%.%d+)") do
    log(ip)
end
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
neves
сообщение 1.10.2020, 10:58
Сообщение #4


***

Novice
Сообщений: 64
Регистрация: 4.10.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.419
Возраст: 19



Thanks Fors1k, cirus!
You guys are awesome.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.10.2020, 21:39
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



One more option for take real external ip http://checkip.dyndns.com . It give answer in plain text without json.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 2.10.2020, 0:57
Сообщение #6


*****

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



Так а зачем без джейсона он нам нужен?) Json делает за нас всю работу и сразу дает value по ключу. Тут же придется парсить ответ вручную.
Ну как запасной вариант иметь тоже можно:
Код
--lua
require"luaposh"
myip = PScode('return',{[[#}
#
$response = Invoke-WebRequest checkip.dyndns.com -useb
$return = [regex]::Matches($response.content, "\d[^<]+").value
#
]]})
log (myip)

Кстати, еще вспомнил, что powershell сам умеет парсить ответ веб запроса. Можно просто запросить DOM-элемент тоже напрямую по ключу "ip":
Код
--lua
require"luaposh"
myip = PScode('return',{[[$return = (iwr myip.com).ParsedHtml.getElementById("ip").outerText]]})
log (myip)

Работают все варианты, но у первого результат получается проще и быстрее всего.

Сообщение отредактировал Fors1k - 2.10.2020, 2:19


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.10.2020, 5:07
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата
Json делает за нас всю работу и сразу дает value по ключу

Для начала его нужно подключать равно, как и пош. Не в обиду, но я сильно не фанат поша. У меня был ряд задач по созданию относительно небольших скриптов и время его старта привело к тому, что были написаны мозговыносящие батники, но зато отрабатывающие за секунду вместо 15. Если, скажем, мне не нужен в работе пош, но мне нужно дернуть ип - я никогда в жизни не буду громоздить это.
Цитата
Тут же придется парсить ответ вручную.

Код
local ip = {string.match("Current IP Address: 111.22.33.44","(%d+)%.(%d+)%.(%d+)%.(%d+)")}

Это всяко проще и короче подключения вагона либ. Про скорость и накладные ресурсы вообще молчу)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
neves
сообщение 2.10.2020, 17:17
Сообщение #8


***

Novice
Сообщений: 64
Регистрация: 4.10.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.419
Возраст: 19



Цитата(DarkMaster @ 1.10.2020, 21:39) *

One more option for take real external ip http://checkip.dyndns.com . It give answer in plain text without json.

Yes, that's also an option and thanks for the idea, but I think to capture the request response you will need something like curl, wget or luasocket.
I modified @cirus answer and used the command nslookup to find the public ipv4.
Код
--lua
log 'clear' log 'mode compact'
function my_public_ip()
    handle = io.popen([[cmd.exe /c nslookup myip.opendns.com resolver1.opendns.com]])
    result = handle:read("*a")
    handle:close()
    return trim(string.match(result, ".*Address: (.*?-.*)"))
end
log(my_public_ip())
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.10.2020, 17:44
Сообщение #9


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Great modification. Its rly good solution.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 3.10.2020, 15:43
Сообщение #10


*****

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



Что ж, взглянем на сухие факты.
Цитата(DarkMaster @ 2.10.2020, 5:07) *
Цитата
Json делает за нас всю работу и сразу дает value по ключу
Для начала его нужно подключать

Json, как и что-либо другое подключать не надо. В поше сразу все есть.
Цитата(DarkMaster @ 2.10.2020, 5:07) *
были написаны мозговыносящие батники

Про CMD/BAT корпорация Microsoft заявляет следующее: PowerShell теперь является стандартной командной оболочкой, которая заменяет CMD.exe.
Разработка cmd.exe была остановлена после выхода Windows 2000(20 лет назад).В качестве основной командной оболочки используется PowerShell.
Цитата(DarkMaster @ 2.10.2020, 5:07) *
я никогда в жизни не буду громоздить это.
Насчет "громоздить" (IMG:style_emoticons/default/smile.gif)

Простая задача. Узнать размер картинки:
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;

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 = [[C:\image_062.jpg]]  -- путь к картинке (возможные форматы: BMP, JPG, TIF, GIF и PNG)
local width, height = image_size( path )
log(width, height)  -- размеры картинки
38 строк.

Для posh это всего лишь одна команда:
Код
--lua
require"luaposh";PScode('return',{[[#}
#
$image = [Drawing.Image]::FromFile("C:\myImg.jpg")
log $image.size; $image.Dispose()
#
]]})

Cirus молодец, что умеет писать такое, большой ему респект. Но суть в том, что никто другой здесь такое не напишет.
Цитата(DarkMaster @ 2.10.2020, 5:07) *

Код
local ip = {string.match("Current IP Address: 111.22.33.44","(%d+)%.(%d+)%.(%d+)%.(%d+)")}

Это всяко проще и короче

Это да, только приведенного кода не существует)
Код, получающий ip такой:
Код
--lua
function my_public_ip()
    handle = io.popen([[cmd.exe /c nslookup myip.opendns.com resolver1.opendns.com]])
    result = handle:read("*a")
    handle:close()
    return trim(string.match(result, ".*Address: (.*?-.*)"))
end
log(my_public_ip())

LuaPosh:
Код
--lua
require"luaposh"
log ( PScode('return',{[[$return = ((iwr -useb freegeoip.app/json).Content|ConvertFrom-Json).ip]]}) )

7 строк vs 2 строки. "Проще и короче" здесь не наблюдается=)
Цитата(DarkMaster @ 2.10.2020, 5:07) *
Про скорость вообще молчу)

Оно и правильно)
Код
--lua
log 'clear';log 'mode compact'
require "luaposh"
measure = 0
i = 0
repeat
--
    t = os.clock()
    myip = PScode('return',{[[$return = ((iwr -useb freegeoip.app/json).Content|ConvertFrom-Json).ip]]})
    measure = measure + (os.clock() -t)
    i = i+1
--
until i == 5
log (myip)
log (measure / 5)
Результат 0.176

Код
--lua
log 'clear';log 'mode compact'
measure = 0
i = 0
repeat
--
    t = os.clock()
    function my_public_ip()
        handle = io.popen([[cmd.exe /c nslookup myip.opendns.com resolver1.opendns.com]])
        result = handle:read("*a")
        handle:close()
        return trim(string.match(result, ".*Address: (.*?-.*)"))
    end
    myip = my_public_ip()
    measure = measure + (os.clock() -t)
    i = i+1
--
until i == 5
log (myip)
log (measure / 5)
Результат 0.409

Разница более чем в 2 раза.
Цитата(DarkMaster @ 2.10.2020, 5:07) *
Не в обиду, но я сильно не фанат поша.

Не, тут обижаться не на что=)
Люди, в большинстве своем, всегда были против прогресса. Пользуются cmd(который 20 лет как мертвый) вместо powershell, слушают музыку в машине на cd вместо аукса или bluetooth, на телефон положить деньги бегают в соседний квартал к терминалу киви, вместо пары кликов в онлайн банке, и т.п. .
Когда-то сжигали на костре людей за слова о том, что земля не плоская, и не солнце вращается вокруг неё, а сейчас, например, поджигают вышки 5G.

Так было и будет всегда, так что я понимал, что пишу данное решение для очень узкого круга людей.
Кстати, в процессе работы над этим проектом, оказалось что в их числе и cirus. Он, который может решить практически люблю задачу на lua в таких ограниченных возможностях этого языка, в этом вопросе оказался отнюдь не старовером, и весьма заинтересованно принимал участие в создании LuaPosh, за что ему большое спасибо.

Сообщение отредактировал Fors1k - 3.10.2020, 16:18


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 3.10.2020, 17:12
Сообщение #11


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Цитата(Fors1k @ 3.10.2020, 15:43) *


Люди, в большинстве своем, всегда были против прогресса. Пользуются cmd(который 20 лет как мертвый) вместо powershell, слушают музыку в машине на cd вместо аукса или bluetooth, на телефон положить деньги бегают в соседний квартал к терминалу киви, вместо пары кликов в онлайн банке, и т.п. .
Когда-то сжигали на костре людей за слова о том, что земля не плоская, и не солнце вращается вокруг неё, а сейчас, например, поджигают вышки 5G.

Так было и будет всегда, так что я понимал, что пишу данное решение для очень узкого круга людей.
Кстати, в процессе работы над этим проектом, оказалось что в их числе и cirus. Он, который может решить практически люблю задачу на lua в таких ограниченных возможностях этого языка, в этом вопросе оказался отнюдь не старовером, и весьма заинтересованно принимал участие в создании LuaPosh, за что ему большое спасибо.



А как понять, что это прям прогресс, а не сиюминутное течение ? Конечно, примеры про cd и онлайн банки хороши, но если касаться мира АйТи: куча решений уже существует, и написаны они как раз лет 20-30 назад. Т.е. с приходом прогресса это нужно все перелопатить чтобы было не 100, а 10 строк ? А зачем, если работает ? Java - 25 лет, C - > 50 лет. Не кажется ли странным, что они сейчас в топе по востребованности в том числе и на новые проекты ? Во всем мире, а не где-то там, в абстрактной стране. Есть же удобнее, быстрее, красивее.....а на их стороне просто вагон опыта и best practices, которые все недостатки перекрывают. Так и тут.



На да, луа очень ограничен, куда ему до powershell, хех.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
neves
сообщение 3.10.2020, 17:51
Сообщение #12


***

Novice
Сообщений: 64
Регистрация: 4.10.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.419
Возраст: 19



Fors1k me personally thinks that posh in some cases is very useful and powerful.
In this case I actually need to check the IP only once in the beginning of the script. So I don't really think I have to import the luaposh in my script for only one check. However, I am grateful to you for giving me an alternative solution using luaposh.

About the speed comparison you made:
The solution I provided isn't actually written to be fast because as I said it will be executed only once in the beginning of the script.
Anyways I tried your code which shows the speed of my solution:
Цитата(Fors1k @ 3.10.2020, 15:43) *

Код
--lua
log 'clear';log 'mode compact'
measure = 0
i = 0
repeat
--
    t = os.clock()
    function my_public_ip()
        handle = io.popen([[cmd.exe /c nslookup myip.opendns.com resolver1.opendns.com]])
        result = handle:read("*a")
        handle:close()
        return trim(string.match(result, ".*Address: (.*?-.*)"))
    end
    myip = my_public_ip()
    measure = measure + (os.clock() -t)
    i = i+1
--
until i == 5
log (myip)
log (measure / 5)


In my case the result was: 0.13020000000006
I haven't tried the posh solution speed yet.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.10.2020, 18:20
Сообщение #13


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата
Json, как и что-либо другое подключать не надо. В поше сразу все есть.

А пош подключать не надо?) Гайка не нужна, мы камаз покупаем - там уже будет.
Цитата
Про CMD/BAT корпорация Microsoft заявляет следующее: PowerShell теперь является стандартной командной оболочкой, которая заменяет CMD.exe.

Макйрософт может заявлть, что угодно. Я буду пользоваться тем, что мне удобно и тем, что подходит для моих нужд. Я могу заявить, что стандартным теперь будет надевать трусы поверх штанов. Как думаешь, майкрософт так будет ходить на работу?
Цитата
Простая задача. Узнать размер картинки:

Я с джепегом не возился - не надо было. Картинки бмпшные рисовал скриптами, сохранял, загружал. Даже если писать с нуля - десяток строк от силы. Есть спец либы для работы с графикой, если нужно что-то хитрое. Весят меньше, шуршат быстрее, функционал больше.


Цитата
Это да, только приведенного кода не существует)

Учитывая, что я не видел, что уже подключено, не знал каков функционал, ограничения и т.д. - код не был написан. Это вполне логично. Как правильно заметил топикстартер вариантов получения много: curl, wget, luasocket, socket2(который пишется в виде чистого биндинга в данный момент). Что уже прикручено к проекту, то и нужно использовать. А перечисленные выше варианты вершина айсберга. Лично у меня luasocket подключается в стандартной шапке.
Цитата
Результат 0.176

Ой а чего это require вне таймера? Лично у меня пош стартует около 15 секунд. Мне оно не надо. При этом хочу заметить, у меня, как и большинства пользователей пош не является постоянно используемым инструментом из-за чего за его обновлением зачастую не следят, а уж в предвыборке в опертивке он не висит тем более, что очень сильно сказывается на времени запуска.
Цитата
Пользуются cmd(который 20 лет как мертвый)

Ну не 20. По крайней мере до XP его не было, а там появился не сразу или калеченный сначала был уж не помню, но суть в том, что его надо было апдейтить. Хотя лично мое мнение cmd устарел и был трупом еще в момент релиза, если не в момент разработки. Убогий функционал, убогий синтаксис, убогая скорость выполнения, но он работает и везде. Пош с совместимостью версий и апдейтов уже доставал меня не один раз. Надо запустить скрипт и вместо запуска скрипта начинаешь качать его апдейты. Оно мне надо? А человек которому я скрипты передавать буду оно надо? А если скрипт для 5 человек? 10? 100? Даже если каждый пятый будет иметь проблемы с совместимость версий - это мне нужно будет в ручном режиме 20 людям объяснить, что им нужно уставить апдейты, уговрить это сделать, выслушать вагон дерьма, что им приходится какой-то херней заниматься и устанавливать им не нужный камаз в системе. Зачем не этим заниматься? С батниками таких проблем нет. Лично я впоследнее время все чаще использую луа, как оболочку вместо cmd. Да, нет конвееров, все несколько через ж, но функционал полноценен, все полностью портабл.
Цитата
Люди, в большинстве своем, всегда были против прогресса.

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

Ну куда мне до продвинутых. Я вот не люблю бегать по приставам судебным которые в пятый раз ой случайно бабки списали за несуществующие либо оплаченные штрафы, суды обжалования, прокуротура, следственный коммитет. Ну да, я для себя решил, что мне проще пройти 100 метров и кинуть денег на телефон, чем годами судиться и добиваться уголовок. Хотя опыт интересный, в целом знание права существенно возросло и посылать с незаконными требованиями стало проще.
Цитата
lua в таких ограниченных возможностях этого языка

Что?))) lua - это среда предназначенная для объединения либ, в случае с luajit это еще и шикарный инструмент для написания биндингов и использования стандартных системных библиотек и сторонних библиотек без каких либо модификаций. Возможности языка исчерпывающие в рамках его назначения - все остальное либы. Есть целые движки игровые которые по сути живут на луа с подключенным набором либ. Зайди на luapower.com и посмотри сколько и чего там существует. Причем огромная доля является кроссплатформенной. Исключение составляют только очень специфические биндинги типа winapi.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.10.2020, 20:13
Сообщение #14


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Тем не менее я не говорю, что пош непригоден для использования. У него есть свои сферы, своя специфика. Но лично у меня ему места не нашлось. Батник - короткий одноразовый вызов, пош - что-то объемное. А зачем писать что-то объемное на системных скриптах? Обычно это именно короткие одноразовые вызовы.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 7.10.2020, 0:43
Сообщение #15


*****

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



Цитата(Cockney @ 3.10.2020, 17:12) *

А как понять, что это прям прогресс

Непонятен вопрос.
Тот же пример, что бы далеко не ходить. Раньше, если нужно было получить разрешение картинки, можно было либо забить на это, либо просить cirus написать километр кода для этого. Теперь делаешь это одной командой в любом месте своего скрипта.
Появился инструмент, который открывает новые возможности, и экономит кучу времени и сил. Не знаю как еще описать значение слова "прогресс" (IMG:style_emoticons/default/smile.gif)

Цитата(Cockney @ 3.10.2020, 17:12) *
куча решений уже существует.

Про то и говорю.
Есть готовое решение, выполняемое одной командой "дай разрешение картинки". В луа же подобное нужно изобретать с нуля.
Есть готовое решение, выполняемое одной командой "дай информацию о процессе". В луа же подобное нужно изобретать с нуля.
И т.д. .
Или это и был аргумент за posh, а я не понял?
Цитата(Cockney @ 3.10.2020, 17:12) *
Т.е. с приходом прогресса это нужно все перелопатить чтобы было не 100, а 10 строк ? А зачем, если работает ?

1. Обсуждаемая здесь задача - новая. Еще ничего не работает. Перелопачивать здесь нечего.
2. Если ты не конкретно про эту задачу, то :
Цитата(Fors1k @ 23.3.2020, 18:20) *

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

Код
--lua
require"luaposh"
--50
--строк
--кода
--тут понадобилось узнать ip
myIp = PScode('return',{[[$return = ((iwr -useb freegeoip.app/json).Content|ConvertFrom-Json).ip]]})
--50
--строк
--кода

Что тут перелопачивать? В любое место воткнул понадобившийся код, и забыл. Специально же такую возможность отметил отдельно. Да и подчеркнул даже..
Цитата(Cockney @ 3.10.2020, 17:12) *

На да, луа очень ограничен, куда ему до powershell, хех.
Не очень хочу залезать в дебри "это круче..нет это круче". Lua - это непременно прорыв относительно языка пилота, и опять же напомню, что одно другого не исключает.
Именно благодаря lua получилось создать luaPosh. На пилоте я бы в жизни это не осилил (даже представить страшно (IMG:style_emoticons/default/biggrin.gif) ).

Если просто в целях дополнительного знакомства с возможностями powershell, возьму первое, что приходит в голову из недавнего.
Незамысловатые задачи:
1. Получить разрешение картинки.
2. Скачать файл из интернета.
3. Узнать сколько времени работает процесс.
4. Узнать о том, что программа запустилась(появилось рабочее окно).

Luaposh:
1. Решается одной командой (код уже был выше).

2. Решается одной командой
Код
--lua
require"luaposh";PScode('void',{[[#}
#
iwr https://forum.uokit.com/style_avatars/IPB_Community_Pack/Orange-sticks.gif -OutFile C:\test.gif
#
]]})

3. Тоже одна строка
Код
--lua
require"luaposh";PScode('return',{[[#}
#
log ( (date) - (Get-Process -id 30896).StartTime )
#
]]})

4. Две строки
Код
--lua
require'luaposh';PScode('return',{[[#}
#
$process = Start-Process notepad.exe -PassThru
while($process.MainWindowHandle -eq 0){log ("Waiting")}
#
]]})
Здесь $process - это объект запущенного процесса. Во второй строке мы ожидаем пока хэндл его окна перестанет быть равным нулю.


Lua:
1. Такой команды нет.
Решение: 38 строк кода
Код
--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;

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 = [[C:\image_062.jpg]]  -- путь к картинке (возможные форматы: BMP, JPG, TIF, GIF и PNG)
local width, height = image_size( path )
log(width, height)  -- размеры картинки
2. Такой команды нет.
Решение: нужно искать, качать и подключать вспомогательный архив из интернета.
3. Такой команды нет.
Решение: 37 строк кода
Код
--lua
local PROCESS_ALL_ACCESS = 2097151
local ffi = require("ffi")
local user, kernel = ffi.load('User32'), ffi.load('Kernel32')
ffi.cdef[[
    typedef unsigned short  WORD;
    typedef unsigned long   DWORD;
    typedef DWORD           *LPDWORD;
    typedef struct _FILETIME {DWORD dwLowDateTime; DWORD dwHighDateTime;} FILETIME, *PFILETIME, *LPFILETIME;
    typedef struct _SYSTEMTIME {WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay;
        WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds;} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
    bool CloseHandle(int hObject);
    int OpenProcess(DWORD dwDesiredAccess, bool bInheritHandle, DWORD dwProcessId);
    bool GetProcessTimes(int hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime);
    DWORD GetWindowThreadProcessId(int hWnd, LPDWORD lpdwProcessId);
    bool FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime);
    bool FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime);
]]
local ft, ft2, ft3, ft4, st = ffi.new('FILETIME'), ffi.new('FILETIME'), ffi.new('FILETIME'), ffi.new('FILETIME'), ffi.new('SYSTEMTIME')
local PID = ffi.new('unsigned long[1]')

function GetProcessTime(handle)
    if handle == 0 then return 0 end
    user.GetWindowThreadProcessId(handle, PID)
    local process = kernel.OpenProcess(PROCESS_ALL_ACCESS, 1, PID[0])
    if process > 0 then
        kernel.GetProcessTimes(process, ft, ft2, ft3, ft4)
        kernel.FileTimeToLocalFileTime(ft, ft);
        kernel.FileTimeToSystemTime(ft, st);
        local datetime = { year = st.wYear, month = st.wMonth, day = st.wDay, hour = st.wHour, min = st.wMinute, sec = st.wSecond}
        kernel.CloseHandle(process);
        return os.time() - os.time(datetime)
    end
    return -1
end
log 'clear' log 'mode compact'
local t = GetProcessTime(workwindow())     -- function call
log (tostring(t) .. ' seconds')
4. Решается через костыль. Естественно, если окно с таким заголовком уже существует, то код не сработает.
Код
--lua
exec ("notepad.exe")

handle = nil
while handle == nil do
    handle = findwindow("Блокнот")
    log("Waiting")
    wait(100)
end

Цитата(DarkMaster @ 3.10.2020, 18:20) *

Макйрософт может заявлть, что угодно. Я буду пользоваться тем, что мне удобно и тем, что подходит для моих нужд. Я могу заявить, что стандартным теперь будет надевать трусы поверх штанов. Как думаешь, майкрософт так будет ходить на работу?

Пытаться комментировать это не стану)))
Цитата(DarkMaster @ 3.10.2020, 18:20) *
Лично у меня пош стартует около 15 секунд. Пош с совместимостью версий и апдейтов уже доставал меня не один раз. Надо запустить скрипт и вместо запуска скрипта начинаешь качать его апдейты.

Если с компом такие проблемы, то может проще отнести его в ремонт, или переустановить ос, чем так мучаться?
У меня на железе 2008 года и какой-то старой win10 он стартует за 2 сек.
Так как
Цитата(Fors1k @ 3.10.2020, 15:43) *
естественно никаких обновлений ни разу не требовалось.
Есть новые версии powershell core, которые нужно устанавливать отдельно. Естественно на них я разработку не веду. Только на встроенной версии.

Короче, так спорить бесконечно можно) Вполне возможно и луа умеет что-то, что не умеет powershell. Но спор не имеет смысла, так как использование одного не исключает другого (IMG:style_emoticons/default/wink.gif)


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 7.10.2020, 1:38
Сообщение #16


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата
Тот же пример, что бы далеко не ходить. Раньше, если нужно было получить разрешение картинки, можно было либо забить на это, либо просить cirus написать километр кода для этого. Теперь делаешь это одной командой в любом месте своего скрипта.

Либо подключить спец либу которая жрет меньше памяти и грузится мгновенно.
Цитата
В луа же подобное нужно изобретать с нуля.

С какого перепугу? Подключай либы.
Цитата
Если с компом такие проблемы, то может проще отнести его в ремонт, или переустановить ос, чем так мучаться?
У меня на железе 2008 года и какой-то старой win10 он стартует за 2 сек.

Читай про предвыборки. Тот факт, что ты его постоянно используешь - увеличивает скорость его загрузки, а иногда и работы. Еще до того, как ты его попытаешься стартануть оно уже в оперативке, а возможно и файлы к которым ты будешь обращаться в ходе работы скрипта.
Цитата
естественно никаких обновлений ни разу не требовалось.

До SP1 его не было в XP насколько я помню. Могу ошибаться давно дело было.
Цитата
PowerShell теперь является стандартной командной оболочкой.

Стандартной ее объявил майкрософт. Дела мне до него мало, если честно. Не более чем дополнительно взвешанные решения в пользу портабл оболочек.
Цитата
естественно никаких обновлений ни разу не требовалось.
Есть новые версии powershell core, которые нужно устанавливать отдельно. Естественно на них я разработку не веду. Только на встроенной версии.

Я тебе еще раз говорю. Это были реальные ситуации. Неоднократные. Для запуска скриптов поша приходилось накатывать апдейты поша на машины.

На самом деле я понимаю, что ты не прочувствуешь всей проблемности этих апдейтов поскольку у тебя повидимому нет большого количества людей которым ты бы поставлял эти скрипты. Поверь, когда зоопарк пользователей завалит тебя вопросами "какого хрена оно не работает". Оно будет даже не так страшно, если это контора какая-нибудь и ты можешь отправить мальчиков накатить апдейты или тупо по удаленке налить. Самое веселое когда это толпа людей из разных городов у которых свои собственные компы и они сами себе админы (могут и нахер послать особо не рассуждая). Вот так начинается забавно. И вот тогда ты поймешь надо тебе это или нет. Лично я без домена и тонких клиентов подобными граблями заниматься больше не буду. Мое время стоит денег и когда я теряю доход, зато у меня все современненько, сдается вопрос на кой черт? У каждого инструмента свое назначение. В общем случае пош не нужен лично мне. Использовать же его, как редактор картинок... нет ну правда?

Цитата
1. Такой команды нет.
2. Такой команды нет.
3. Такой команды нет.

Мне просто интересно ты на C/C++ скажешь тоже самое? У них тоже нет и тоже нужно подключать либы/заголовки)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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