可視コマンド ウィンドウを作成せずに、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
これまでの回答に感謝しますが、私は自分の解決策を見つけました。提案された 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 用の空のファイルが必要であるということです。
私が考えることができる最も簡単な方法は、Windows シェル スクリプト (vbs または cmd) 内から rsync コマンドを実行することです。
Haskell については何も知りませんが、数か月前に C プロジェクトでこの問題が発生しました。
ウィンドウがポップアップせずに外部プログラムを実行する最善の方法は、ShellExecuteEx() API 関数を「open」動詞とともに使用することです。Haskell で ShellExecuteEx() を使用できる場合は、目的を達成できるはずです。
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);
}
}