Рейтинг:
2
RickZeeland
Попробуйте эту реализацию и посмотрите, работает ли она: планировщик[^]
Обратите внимание, что при запуске этого приложения в качестве службы Windows вы не можете запускать с его помощью приложения Windows.
Другим, возможно, более простым вариантом было бы вызвать TaskScheduler с помощью Process, например:
// Create updater task "TEST Task" between 9 and 10 on monday.
var scheduleTime = "9:" + DateTime.Now.Minute.ToString("D2");
this.CreateSchedulerTask("TEST Task", scheduleTime, Application.ExecutablePath);
/// <summary>
/// Create Windows scheduler task to run weekly on monday.
/// Exclude from obfuscation.
/// </summary>
/// <param name="scheduleTime">The time to run the task.</param>
private void CreateSchedulerTask(string myTaskName, string scheduleTime, string myApp)
{
try
{
var command = Path.Combine(Environment.SystemDirectory, @"SchTasks");
var args = "/Query";
var result = ProcessRun(command, args, true);
if (result.Contains(myTaskName))
{
Debug.Print(myTaskName + " already running.");
return;
}
command = Path.Combine(Environment.SystemDirectory, @"SchTasks");
args = "/Create /SC WEEKLY /D MON /TN \"" + myTaskName + "\" /TR \"" + myApp + "\" /ST " + scheduleTime;
Debug.Print(command + " " + args);
result = ProcessRun(command, args, false);
if (!string.IsNullOrEmpty(result))
{
MessageBox.Show(result);
}
else
{
MessageBox.Show(@"Scheduler task created: monday every week at " + scheduleTime);
}
}
catch (Exception ex)
{
MessageBox.Show("CreateSchedulerTask()" + ex.Message);
}
}
/// <summary>
/// Runs an elevated command using ShellExecute 'runas' if redirectStandardOutput is false.
/// Waits until completed.
/// </summary>
/// <param name="fileName">The file name or command to run.</param>
/// <param name="args">The arguments to pass.</param>
/// <param name="redirectStandardOutput">Redirect Standard Output.</param>
/// <param name="waitForExit">Optional: default wait max 2 minutes.</param>
/// <param name="hideWindow">Optional: default do not hide window.</param>
/// <returns>Empty string on success.</returns>
public string ProcessRun(string fileName, string args, bool redirectStandardOutput, bool waitForExit = true, bool hideWindow = false)
{
string result = string.Empty;
const int ErrorCancelled = 1223;
try
{
using (Process process = new Process())
{
process.StartInfo = new ProcessStartInfo();
process.StartInfo.FileName = fileName;
if (hideWindow)
{
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
}
if (!string.IsNullOrEmpty(args))
{
process.StartInfo.Arguments = args;
}
process.StartInfo.CreateNoWindow = true;
if (redirectStandardOutput)
{
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.Start();
using (StreamReader reader = process.StandardOutput)
{
string resultOut = reader.ReadToEnd();
Debug.Print(resultOut);
}
}
else
{
process.StartInfo.Verb = "runas";
process.StartInfo.UseShellExecute = true;
process.Start();
}
if (waitForExit)
{
// Timeout 2 minutes
process.WaitForExit(120000);
}
}
}
catch (Win32Exception ex)
{
if (ex.NativeErrorCode == ErrorCancelled)
{
result = "ProcessRun() cancelled";
}
else
{
result = @"ProcessRun() error: " + ex.Message;
}
}
catch (Exception ex)
{
result = @"ProcessRun() error: " + ex.Message;
}
return result;
}
Beneck90
Первое решение, которое вы мне дали, не расписывает задачу, я запускаю приложение, но ничего не делаю, а второе не работает, спасибо!
RickZeeland
Тогда, может быть, что-то не так с вашим Windows TaskScheduler или другие приложения мешают ему, когда вы вводите задачу вручную, это работает ?
Beneck90
Если он работает вручную ...
RickZeeland
Goto Windows Find - введите "планировщик задач" и создайте задачу вручную.
Beneck90
Разработка приложения идея состоит в том, чтобы иметь возможность делать это из программы, а не непосредственно из Диспетчера задач ...
RickZeeland
Идея состояла в том, чтобы проверить, работает ли задача, если вы вводите ее вручную ...
Beneck90
да, он работает вручную
Beneck90
Я использую библиотеку TaskScheduler
"пользуясь планировщиком;"
Составитель Заданий.ссылка на dll уже добавлена ...