модуль для запуска консольных программ и получения их вывода

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
zg
zero-gravity
Posts: 5203
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 40 times
Contact:

Re: модуль для запуска консольных программ и получения их вы

Postby zg » Tue 10 Jun, 2014 16:18

Latest post of the previous page:

John Doe wrote:В таком случае в чём преимущество обсуждаемой тут реализации Execute перед стандартной io.popen?
как у io.popen задать текущую директорию для запускаемого процесса?

User avatar
John Doe
Бюрократ
Posts: 11038
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Re: модуль для запуска консольных программ и получения их вы

Postby John Doe » Tue 10 Jun, 2014 16:40

zg wrote:
John Doe wrote:В таком случае в чём преимущество обсуждаемой тут реализации Execute перед стандартной io.popen?
как у io.popen задать текущую директорию для запускаемого процесса?

Предварительно вызвать SetCurrentDirectory (через ffi).
Или cd DIR & COMMAND.

И я не утверждаю, что преимуществ нет, а наоборот, спрашиваю в чём они, т.к. эта информация должна быть в шапке.

User avatar
zg
zero-gravity
Posts: 5203
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 40 times
Contact:

Re: модуль для запуска консольных программ и получения их вы

Postby zg » Tue 10 Jun, 2014 16:47

John Doe wrote:Предварительно вызвать SetCurrentDirectory (через ffi).
Или cmd /c cd ... &
а текущий путь сетевой и в реестре нет DisableUNCCheck.

User avatar
John Doe
Бюрократ
Posts: 11038
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Re: модуль для запуска консольных программ и получения их вы

Postby John Doe » Tue 10 Jun, 2014 17:01

Не имею представления, как и многие другие пользователи, поэтому и прошу указать подробности в шапке.

User avatar
John Doe
Бюрократ
Posts: 11038
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Re: модуль для запуска консольных программ и получения их вы

Postby John Doe » Wed 11 Jun, 2014 07:33

Третий параметр Execute - функция-коллбек, которая будет вызываться на каждой полученной строке вывода запущенной программы.
Мне кажется для lua 5.x идиоматичнее было бы использовать итератор.

Update
Если использовать корутины, то требуемые изменения минимальны:
После этого функцией можно пользоваться например так:

Code: Select all

local output = Execute("cmd /cdir")
if output then
  for line in output do far.Show(line)
end


Update2
При таком использовании закрывать хэндлы надёжнее в финалайзере, как-то так:

User avatar
John Doe
Бюрократ
Posts: 11038
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Re: модуль для запуска консольных программ и получения их вы

Postby John Doe » Thu 12 Jun, 2014 11:41

zg wrote:
tstr wrote:При запуске через Execute "доходит" ли до процесса CtrlC/CtrlBreak ?
да.
Почему-то не доходит: Execute("cmd /cdir /s","c:\\",function()end)

User avatar
zg
zero-gravity
Posts: 5203
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 40 times
Contact:

Re: модуль для запуска консольных программ и получения их вы

Postby zg » Thu 12 Jun, 2014 12:48

John Doe wrote:Почему-то не доходит: Execute("cmd /cdir /s","c:\\",function()end)
у меня всё ок.

User avatar
John Doe
Бюрократ
Posts: 11038
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Re: модуль для запуска консольных программ и получения их вы

Postby John Doe » Thu 12 Jun, 2014 13:10

Windows XP x86, FAR 3.0 build 3951, запущеный командой C:\APPs\Far3\far.exe /p%FARHOME%\Plugins\LuaMacro /m.
Беру execute.lua из шапки, запускаю так: lua:loadfile"execute.lua"()("cmd /cdir /s","c:\\",function()end).

После этого фар надолго зависает (не ждал до конца), CtrlBreak/CtrlC не действуют.

Shmuel
Posts: 4946
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 123 times

Re: модуль для запуска консольных программ и получения их вы

Postby Shmuel » Thu 12 Jun, 2014 19:12

John Doe wrote:фар надолго зависает (не ждал до конца), CtrlBreak/CtrlC не действуют.

Модуль execute не является причиной зависания. Если запустить
lflua -e"(require 'execute')('cmd /cdir /s','c:\\',function() end)",
то действуют и CtrlBreak, и CtrlC.

User avatar
John Doe
Бюрократ
Posts: 11038
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Re: модуль для запуска консольных программ и получения их вы

Postby John Doe » Thu 12 Jun, 2014 20:27

Windows 8.1 x86
CtrlBreak действует, CtrlC - нет.
При запуске через lflua работают оба сочетания.

buniak_a_h
Posts: 251
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 29 times
Been thanked: 3 times
Contact:

модуль для запуска консольных программ и получения их вывода

Postby buniak_a_h » Thu 07 Jan, 2016 20:26

Мне не хватало кода возврата. Тупым подбором (не зная языка) добился:
1. В начало процедуры function Execute (после определения pipe_security) добавить строку
local iRet=ffi.new("int[1]")
2. Перед строкой C.CloseHandle(info.hProcess) вставить строки:
if not C.GetExitCodeProcess(info.hProcess, iRet) then
iRet[0] = -1
end

3. В конец процедуры function Execute (непосредственно перед end) вставить строку:
return iRet[0]
--
Мне кажется, это было бы полезно не только мне...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании


Return to “Полезные макросы и скрипты”

Who is online

Users browsing this forum: No registered users and 1 guest