Установщик консольных приложений Visual Studio — запланировать задачу Windows

#visual-studio-2010 #installation #wix #scheduled-tasks

#visual-studio-2010 #установка #wix #запланированные задачи

Вопрос:

Кто-нибудь знает, как создать проект установки с помощью Visual Studio 2010, который создает задачу планировщика Windows? Я создаю установщик для консольного приложения, которое должно запускаться каждые X минут, и было бы неплохо, чтобы клиенту не приходилось планировать его вручную.

Спасибо!

Ответ №1:

в Wix (.wixproj) вы можете сделать это в пользовательском действии, написанном на Jscript, которое вызывает Schtasks.exe .

Я не знаю о поддержке WIX в VS2010, я думаю, что она встроенная.

Пользовательский модуль действий (файл .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 в script — это неправильно, потому что их сложно поддерживать, сложно отлаживать или сложно сделать их правильно. Я думаю, что это плохие причины. CA, правильно реализованные в скрипте, работают хорошо.

Комментарии:

1. Это один из способов, но WIX имеет встроенное пользовательское действие, которое лучше.

2. Ах, я этого не знал. Гораздо лучше использовать встроенную вещь.

3. Я попробовал это и заставил его работать, но это была небольшая работа! Спасибо за ответ. Похоже, вы потратили на это некоторое время, и я это ценю!

4. Эрик, не за что. Я не потратил много времени на ваш вопрос. У меня самого был похожий вопрос, и я решил его некоторое время назад, поэтому я просто преобразовал то, что написал для себя, в вашу ситуацию. Прошло 2 минуты. в любом случае я рад, что это было полезно. Я не знал о встроенном пользовательском действии для запуска schtasks. похоже, это проще. В моем случае мне нужно было проанализировать вывод команды, и поэтому простого выполнения команды, как со встроенной возможностью, было недостаточно. Возможно, вам не важен результат.

Ответ №2:

WIX имеет собственное пользовательское действие для создания задач Windows и их планирования.

 <CustomAction Id="CreateScheduledTask" Return="check" Directory="Application" ExeCommand="amp;quot;[SystemFolder]SCHTASKS.EXEamp;quot; /CREATE /SC DAILY /TN amp;quot;My Taskamp;quot; /ST 12:00:00 /TR amp;quot;[INSTALLLOCATION]AppsFile.exeamp;quot; /RU [%USERDOMAIN][LogonUser]" />
  

Приведенная выше команда создаст задачу с именем «Моя задача», которая будет выполняться каждый день в 12 часов ночи.

Команда SCHTASKS используется для создания и планирования задачи Windows.

Комментарии:

1. Спасибо. Это работает и было самым простым из двух подходов, приведенных до сих пор.