Visual Studio控制台应用程序安装程序 - 计划Windows任务

问题描述:

有谁知道如何使用创建Windows调度程序任务的Visual Studio 2010创建安装项目?我正在为一个需要每X分钟运行一次的控制台应用程序构建一个安装程序,并且如果客户不需要手动安排它,那将会很好。Visual Studio控制台应用程序安装程序 - 计划Windows任务

谢谢!

WIX有自己的自定义操作来创建窗口任务并安排它们。

<CustomAction Id="CreateScheduledTask" Return="check" Directory="Application" ExeCommand="&quot;[SystemFolder]SCHTASKS.EXE&quot; /CREATE /SC DAILY /TN &quot;My Task&quot; /ST 12:00:00 /TR &quot;[INSTALLLOCATION]Apps\File.exe&quot; /RU [%USERDOMAIN]\[LogonUser]" /> 

上面的命令将创建一个名为'我的任务'的任务,该任务将在每天上午12点执行。

SCHTASKS命令用于创建和调度Windows任务。

+0

谢谢。这是有效的,并且是迄今为止给出的两种方法中较为简单的方法。 –

在Wix(.wixproj)中,您可以在使用Jscript编写的CustomAction中调用Schtasks.exe

我不知道VS2010对WIX的支持,我认为它是内置的。

自定义操作模块(该.js文件)应具备的功能来运行的schtasks命令,像这样:

function RunSchtasksCmd(command, deleteOutput) { 
    deleteOutput = deleteOutput || false; 
    var shell = new ActiveXObject("WScript.Shell"); 
    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    var tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder); 
    var tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName()); 
    var windir = fso.GetSpecialFolder(SpecialFolders.WindowsFolder); 
    var schtasks = fso.BuildPath(windir,"system32\\schtasks.exe") + " " + command; 

    // use cmd.exe to redirect the output 
    var rc = shell.Run("%comspec% /c " + schtasks + "> " + tmpFileName, WindowStyle.Hidden, true); 
    if (deleteOutput) { 
     fso.DeleteFile(tmpFileName); 
    } 
    return { 
     rc : rc, 
     outputfile : (deleteOutput) ? null : tmpFileName 
    }; 
} 

,然后使用从自定义操作功能本身,像内这

var r = RunSchtasksCmd("/Create Foo bar baz"); 
if (r.rc !== 0) { 
    // 0x80004005 == E_FAIL 
    throw new Error("exec schtasks.exe returned nonzero rc ("+r.rc+")"); 
} 

var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var textStream = fso.OpenTextFile(r.outputfile, OpenMode.ForReading); 

// Read from the file and parse the results. 
while (!textStream.AtEndOfStream) { 
    var oneLine = textStream.ReadLine(); 
    var line = ParseOneLine(oneLine); // look for errors? success? 
} 
textStream.Close(); 
fso.DeleteFile(r.outputfile); 

有人说写CA的剧本是错误的做法,因为他们难以维持,难以调试,或者很难做他们的权利。我认为这些都是不好的理由。 CA在脚本中正确实施,运作良好。

+0

这是一种方式,但WIX具有内置的自定义操作,效果更好。 –

+0

啊,我不知道。更好地使用内置的东西。 – Cheeso

+0

我确实尝试过并让它工作,但它有点工作!感谢你的回答。看起来你花了一些时间在上面,而且我确实赞同它! –