Используйте Lua os.выполните в windows, чтобы запустить программу без вспышки CMD

Я с радостью запускаю программу в системе windows от Lua, используя

strProgram = '"C:Program FilesPs PadPSPad.exe"'
strCmd = 'start "" '..strProgram
os.execute(strCmd)

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

3 ответов


ОС Lua.команда execute основана на функции "shell" стандартной библиотеки C. В Windows эта функция всегда создает командное окно и всегда останавливает текущий процесс до завершения окна. Последнее также происходит в Linux.

в конечном счете, нет никакого способа обойти это. Не через стандартный API Lua. Поскольку Lua должен быть легким и независимым от платформы, API не разрешается использовать собственные API, зависящие от ОС.

ваш лучший выбор было бы использовать Lua Ex-Api модуль. Это эффективно abandonware, и вам может потребоваться исправить несколько проблем компилятора (я предполагаю, что порт Windows не был их первым приоритетом). Но это достаточно хороший способ порождать процессы. Вы можете подождать, пока он закончит себя, или позволить им работать параллельно. И он не будет выдавать окно командной строки, если само приложение не использует его.


Это фрагмент кода, который я использую для вызова пакета из Lua, возможно, помощь. В консоли win (командной строке) откройте и выполните, то же самое в unix (mac|nix)

-- sBatchFile = .bat for windows, .sh for x
function vfFork2(sBatchFile)
    local b = package.cpath:match("%p[\|/]?%p(%a+)")
    if b == "dll" then 
        -- windows
        os.execute('start cmd /k call "'..sBatchFile..'"')
    elseif b == "dylib" then
        -- macos
        os.execute('chmod +x "'..sBatchFile..'"')
        os.execute('open -a Terminal.app "'..sBatchFile..'"')
    elseif b == "so" then
        -- Linux
        os.execute('chmod +x "'..sBatchFile..'"')
        os.execute('xterm -hold -e "'..sBatchFile..'" & ')
    end 
end 

Это способ выполнить команду без окна консоли, используя только стандартный API Lua (т. е. без дополнительных библиотек). Проверена на Win7 х64.

function exec_silent(command)
    local p = assert(io.popen(command))
    local result = p:read("*all")
    p:close()
    return result
end

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