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

3

有人知道如何使用Visual Studio 2010创建安装项目以创建Windows计划任务吗?我正在为需要每X分钟运行的控制台应用程序构建安装程序,让客户不必手动安排将是很好的选择。

谢谢!

2个回答

2
在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,它们可以很好地工作。

这是一种方法,但WIX有内置的自定义操作,更好。 - Sunil Agarwal
啊,我不知道那个。使用内置的东西会更好。 - Cheeso
我尝试过这个,最终成功了,但确实需要花费一些功夫!感谢您的答复。看起来您在其中花费了一些时间,我非常感激! - bopapa_1979
Eric,不用谢。我没有花太多时间回答你的问题。我之前也有一个类似的问题,并且在一段时间前已经解决了,所以我只是把我为自己写的东西转换成了适合你的情况。这只花了我2分钟。无论如何,我很高兴它对你有帮助。我之前不知道内置的自定义操作可以运行schtasks。看起来这更简单。在我的情况下,我需要解析命令的输出,因此仅使用内置功能执行命令是不够的。你可能不关心输出。 - Cheeso

0

WIX有自己的自定义操作,用于创建Windows任务并安排它们。

<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任务。


谢谢。这个方法可行,而且是到目前为止给出的两种方法中更简单的一种。 - bopapa_1979

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接