如何在没有创建可见命令窗口的情况下在Windows上使用Haskell创建后台进程?
我编写了一个定期运行备份过程的Haskell程序,但每次运行它时,命令窗口都会打开到所有窗口的顶部.我想摆脱这个窗口.最简单的方法是什么?
您应该告诉我们您当前是如何尝试这样做的,但在我的系统上(使用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
Run Code Online (Sandbox Code Playgroud)
感谢到目前为止的答复,但我已经找到了自己的解决方案。我确实尝试了很多不同的事情,从按照建议编写 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)
Run Code Online (Sandbox Code Playgroud)
这有效!没有命令窗口了!需要注意的是,即使在我的情况下不需要 inH 作为 STDIN 读入,您也需要一个空文件。
| 归档时间: |
|
| 查看次数: |
4069 次 |
| 最近记录: |