使用Windows的計(jì)劃任務(wù)功能可以創(chuàng)建定時(shí)任務(wù)。
使用schtasks.exe可以對(duì)計(jì)劃任務(wù)進(jìn)行管理,而不需要編寫(xiě)額外代碼
這里掌握schtasks /CREATE 的幾個(gè)核心參數(shù)就可以快速創(chuàng)建計(jì)劃任務(wù)
/SC | 計(jì)劃頻率(schedule)
必須是以下值
MINUTE:每分鐘
HOURLY:每小時(shí)
DAILY:每天
WEEKLY:每周
MONTHLY:每月
ONCE:一次
ONSTART:計(jì)算機(jī)啟動(dòng)時(shí)
ONLOGON:用戶登錄時(shí)
ONIDLE:當(dāng)計(jì)算機(jī)空閑時(shí)
ONEVENT:當(dāng)特定事件被記錄時(shí) |
| 任務(wù)名稱(taskname)
以路徑\名稱形式指定 任務(wù)名稱。如 MyTaskFolder\MyTask |
| 任務(wù)的開(kāi)始時(shí)間(starttime) 時(shí)間格式為 HH:mm (24 小時(shí)時(shí)間),例如 14:30 表示 2:30 PM。如果未指定 /ST,則默認(rèn)值為 當(dāng)前時(shí)間 |
| 任務(wù)程序的路徑(taskrun) 例如: C:\windows\system32\notepad.exe
如果程序有參數(shù),空格然后加在程序路徑后即可
例如: C:\windows\system32\notepad.exe a.txt |
| 運(yùn)行任務(wù)的日期(days)
當(dāng)SC是WEEKLY時(shí):
可選MON、TUE、WED、THU、FRI、SAT、SUN
當(dāng)SC是MONTHLY時(shí):
可選 1 - 31
通配符“*”指定所有日期。 |
/M | 指定一年內(nèi)的某月(months) 。默認(rèn)是該月的第一天。
可選:
JAN、FEB、MAR、APR、MAY、JUN、 JUL、 AUG、SEP、OCT、NOV 和 DEC。
通配符"*"代表所有月份
|
示例:
創(chuàng)建一個(gè)名為MyTask1的計(jì)劃任務(wù),位于MyTaskFolder文件夾下,該任務(wù)在每天的12:00執(zhí)行 "notepad.exe test.txt"
schtasks /create /SC DAILY /TN "MyTaskFolder\MyTask1" /ST "12:00" /TR "C:\Windows\System32\notepad.exe test.txt"
創(chuàng)建一個(gè)名為MyTask1的計(jì)劃任務(wù),位于MyTaskFolder文件夾下,該任務(wù)在每周一的12:00執(zhí)行 "notepad.exe test.txt"
schtasks /create /SC WEEKLY /D MON /TN "MyTaskFolder\MyTask2" /ST "12:00" /TR "C:\Windows\System32\notepad.exe test.txt"
創(chuàng)建一個(gè)名為MyTask1的計(jì)劃任務(wù),位于MyTaskFolder文件夾下,該任務(wù)在每個(gè)月15號(hào)的12:00執(zhí)行 "notepad.exe test.txt"
schtasks /create /SC MONTHLY /M * /D 15 /TN "MyTaskFolder\MyTask3" /ST "12:00" /TR "C:\Windows\System32\notepad.exe test.txt"
在C#中調(diào)用使用Process類執(zhí)行上面命令即可。可以參考以下的代碼
因?yàn)樵路葸@里我需要每個(gè)月,所以就沒(méi)定義月份枚舉了,只定義了每周的枚舉。
WeekDay.cs
天的枚舉
public enum WeekDay
{
MON,
TUE,
WED,
THU,
FRI,
SAT,
SUN
}
TaskSchedulerManager.cs
對(duì)計(jì)劃任務(wù)進(jìn)行一個(gè)簡(jiǎn)單的創(chuàng)建管理,可以根據(jù)自己需求進(jìn)行修改。
public class TaskSchedulerManager
{
private const string SCHTASKS = "schtasks.exe";
public static bool IsExistTask(string taskName)
{
var result = ProcessHelper.GetConsoleOutput(SCHTASKS, "/query");
return result.Contains(taskName);
}
public static bool CreateDailyTask(string taskName, string exePath, string args, string time)
{
if (IsExistTask(taskName))
return true;
var taskArgs = $"/create /SC DAILY /TN \"{taskName}\" /ST \"{time}\" /TR \"{exePath} {args}\"";
var result = ProcessHelper.GetConsoleOutput(SCHTASKS, taskArgs);
return result.Contains(taskName);
}
public static bool CreateWeeklyTask(string taskName, string exePath, string args, string time, WeekDay weekDay)
{
if (IsExistTask(taskName))
return true;
var taskArgs = $"/create /SC WEEKLY /D {weekDay} /TN \"{taskName}\" /ST \"{time}\" /TR \"{exePath} {args}\"";
var result = ProcessHelper.GetConsoleOutput(SCHTASKS, taskArgs);
return result.Contains(taskName);
}
public static bool CreateMonthlyTask(string taskName, string exePath, string args, string time, int monthDay)
{
if (IsExistTask(taskName))
return true;
var taskArgs = $"/create /SC MONTHLY /M * /D {monthDay} /TN \"{taskName}\" /ST \"{time}\" /TR \"{exePath} {args}\"";
var result = ProcessHelper.GetConsoleOutput(SCHTASKS, taskArgs);
return result.Contains(taskName);
}
}
ProcessHelper.cs
這個(gè)方法是獲取控制臺(tái)的輸出
public class ProcessHelper
{
public static string GetConsoleOutput(string cmd,string args = "")
{
var output = "";
Process process = new Process();
ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.Arguments = args;
psInfo.FileName = cmd;
psInfo.UseShellExecute = false;
psInfo.RedirectStandardOutput = true;
psInfo.CreateNoWindow = false;
process.StartInfo = psInfo;
process.OutputDataReceived += (a, b) => { output += b.Data; };
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
process.Close();
process.Dispose();
return output;
}
}
如果需要編程進(jìn)行控制的,可以使用CLSID_TaskScheduler的COM接口
覺(jué)得麻煩不想自己封裝的,可以直接使用nuget包
NuGet\Install-Package TaskScheduler -Version 2.10.1
另外:
刪除任務(wù)可以使用下面的命令
schtasks /delete /TN {taskName} /F
參考文檔:
schtasks.exe使用說(shuō)明
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks
TaskScheduler API
https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page
C# TaskSchduler COM API
https://www.pinvoke.net/default.aspx/Interfaces/ITaskScheduler.html
該文章在 2025/7/2 16:58:25 編輯過(guò)