In Wix (.wixproj) können Sie dies in einer in Jscript geschriebenen CustomAction tun, die Folgendes aufruft Schtasks.exe .
Ich weiß nicht, ob VS2010 WIX unterstützt, ich glaube, es ist eingebaut.
Das benutzerdefinierte Aktionsmodul (die .js-Datei) sollte eine Funktion zur Ausführung eines schtasks-Befehls enthalten, etwa so:
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
};
}
Und dann verwenden Sie das in der benutzerdefinierten Aktionsfunktion selbst, etwa so
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);
Manche Leute sagen, dass es falsch ist, CAs in Skripten zu schreiben, weil sie schwer zu warten oder zu debuggen sind oder weil es schwer ist, sie richtig zu machen. Ich denke, das sind schlechte Gründe. CAs, die korrekt in Skripten implementiert sind, funktionieren gut.