如何在沒有創建可見命令窗口的Windows上使用Haskell創建後臺進程?在沒有可見控制檯窗口的窗口中創建後臺進程
我寫了一個Haskell程序,它定期運行備份過程,但每次運行它時,命令窗口都會打開到所有窗口的頂部。我想擺脫這個窗口。什麼是最簡單的方法來做到這一點?
如何在沒有創建可見命令窗口的Windows上使用Haskell創建後臺進程?在沒有可見控制檯窗口的窗口中創建後臺進程
我寫了一個Haskell程序,它定期運行備份過程,但每次運行它時,命令窗口都會打開到所有窗口的頂部。我想擺脫這個窗口。什麼是最簡單的方法來做到這一點?
我能想到的最簡單的方法是從Windows Shell腳本(vbs或cmd)中運行rsync命令。
我對Haskell一無所知,但幾個月前我在一個C項目中遇到了這個問題。
在沒有任何窗口彈出的情況下執行外部程序的最佳方法是使用帶有「open」動詞的ShellExecuteEx()API函數。如果ShellExecuteEx()在Haskell中可用,那麼你應該能夠實現你想要的。
C代碼看起來是這樣的:
SHELLEXECUTEINFO Info;
BOOL b;
// Execute it
memset (&Info, 0, sizeof (Info));
Info.cbSize = sizeof (Info);
Info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
Info.hwnd = NULL;
Info.lpVerb = "open";
Info.lpFile = "rsync.exe";
Info.lpParameters = "whatever parameters you like";
Info.lpDirectory = NULL;
Info.nShow = SW_HIDE;
b = ShellExecuteEx (&Info);
if (b)
{
// Looks good; if there is an instance, wait for it
if (Info.hProcess)
{
// Wait
WaitForSingleObject (Info.hProcess, INFINITE);
}
}
我不相信它是直接的,但它只是一小部分的FFI。 – wnoise 2008-09-26 21:03:21
你真的應該告訴我們你是怎樣嘗試目前做到這一點,但我的系統上(使用Linux)下面的片段將在不打開運行命令一個新的終端窗口。它應該在Windows上以相同的方式工作。
module Main where
import System
import System.Process
import Control.Monad
main :: IO()
main = do
putStrLn "Running command..."
pid <- runCommand "mplayer song.mp3" -- or whatever you want
replicateM_ 10 $ putStrLn "Doing other stuff"
waitForProcess pid >>= exitWith
直接在Linux命令行上運行的腳本確實傾向於在Windows中彈出cmd窗口。昨天我第一次體驗了這種快樂。 – 2008-09-09 17:02:24
感謝迄今的迴應,但我找到了自己的解決方案。我嘗試了很多不同的東西,從寫一個vbs腳本到建議的獨立程序hstart。 hstart的工作......但它創造了一個我不喜歡的獨立過程,因爲那樣我就無法以正常的方式殺死它。但是我發現了一個簡單的解決方案,它只需要Haskell代碼。
我之前的代碼是對runCommand的簡單調用,它沒有彈出窗口。您可以使用的替代功能是runProcess,它具有更多選項。從偷看ghc源代碼文件runProcess.c,我發現當爲所有STDIN,STOUT和STDERR提供重定向時,CREATE_NO_WINDOW標誌被設置。所以這就是你需要做的,爲這些人提供重定向。我的測試程序看起來像:
import System.Process
import System.IO
main = do
inH <- openFile "in" ReadMode
outH <- openFile "out" WriteMode
runProcess "rsync.bat" [] Nothing Nothing (Just inH) (Just outH) (Just outH)
這工作!再沒有命令窗口!需要注意的是,你需要一個空文件來作爲STDIN事件讀入inh,儘管在我的情況下它不是必需的。
這個問題應該重新打開,因爲它是關於「特定的編程問題」,特別是如何在Haskell的背景下啓動一個進程。 – Cirdec 2014-09-07 21:47:02
爲了重新開放而編輯/重寫。我認爲這是一個有用的問題。我也認爲它應該重新開放 – Andre 2016-08-23 20:17:54