Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# - Using scheduled tasks with Process.Start

Tags:

c#

.net

windows

I am trying to integrate a scheduled job statement into Process.Start

Process.Start("schtasks.exe", "\"" + textBox1.Text + "\"");

How would it be possible to add the parameters below into the Process.Start statement above?

schtasks /Create /SC DAILY /TN TestJob /TR "C:\Program Files\test\test.exe 'C:\'"
like image 821
James Avatar asked Jun 19 '11 14:06

James


2 Answers

You can interact with the windows task manager directly using TaskScheduler. It will give you access to a whole range of properties of the task and under what conditions it will be fired. It, of course, require more code, but it gives you all the control that you need in a managaged manner.

This is a piece of code that im using myself and it is working well (ive cut away some of my business logic so not all arguments will compile/make sense). It will basically create a task that will fire one minute from Now:

    TaskScheduler.TaskScheduler scheduler = new TaskScheduler.TaskScheduler();
    scheduler.Connect(null, null, null, null); //run as current user.

    ITaskDefinition taskDef = scheduler.NewTask(0);
    taskDef.RegistrationInfo.Author = "Me me me";
    taskDef.RegistrationInfo.Description = "My description";
    taskDef.Settings.ExecutionTimeLimit = "PT10M"; // 10 minutes
    taskDef.Settings.DisallowStartIfOnBatteries = false;
    taskDef.Settings.StopIfGoingOnBatteries = false;
    taskDef.Settings.WakeToRun = true;

    ITimeTrigger trigger = (ITimeTrigger)taskDef.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);

    DateTime nextRun = DateTime.Now.AddMinutes(1); // one minute from now
    trigger.StartBoundary = nextRun.ToString("s", System.Globalization.CultureInfo.InvariantCulture);

    IExecAction action = (IExecAction)taskDef.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
    action.Id = "exe name";
    action.Path = "path to exe";
    action.WorkingDirectory = "working dir";
    action.Arguments = "app arguments";  /// <-- here you put your arguments..

    ITaskFolder root = scheduler.GetFolder("\\");

    IRegisteredTask regTask = root.RegisterTaskDefinition(
        "My task name",
        taskDef,
        (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,
        null, // user
        null, // password
        _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, //User must already be logged on. The task will be run only in an existing interactive session.
        "" //SDDL
        );

More explaination and code samples can be found here: Calling the Task Scheduler in Windows Vista (and Windows Server 2008) from managed code

like image 77
Avada Kedavra Avatar answered Oct 19 '22 21:10

Avada Kedavra


The problem is you need to double-escape.

The proper command at the command line for:

schtasks /Create /SC DAILY /TN TestJob /TR "C:\Program Files\test\test.exe 'C:\'"

is

schtasks /Create /SC DAILY /TN TestJob /TR "\"C:\\Program Files\\test\\test.exe\" \"C:\\\""

So that means you'll need:

Process.Start("schtasks.exe", string.Format(@"/Create /SC DAILY /TN TestJob /TR """"{0}"" ""{1}""""", textBox1.Text.Replace("\", "\\"), @"C:\"));

(Don't have a compiler handy so there may be typos, but you should get the idea.) I'm making the assumption that textBox contains the path to the exe, not sure where the parameter is coming from or if it's hard coded.

like image 1
Davy8 Avatar answered Oct 19 '22 20:10

Davy8