在没有可见控制台窗口的Windows中创建后台进程

air*_*tyh 6 windows haskell

如何在没有创建可见命令窗口的情况下在Windows上使用Haskell创建后台进程?

我编写了一个定期运行备份过程的Haskell程序,但每次运行它时,命令窗口都会打开到所有窗口的顶部.我想摆脱这个窗口.最简单的方法是什么?

Ala*_*air 5

您应该告诉我们您当前是如何尝试这样做的,但在我的系统上(使用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)


air*_*tyh 5

感谢到目前为止的答复,但我已经找到了自己的解决方案。我确实尝试了很多不同的事情,从按照建议编写 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 读入,您也需要一个空文件。


Apo*_*isp 0

我能想到的最简单的方法是从 Windows Shell 脚本(vbs 或 cmd)中运行 rsync 命令。