Skip to content

Commit 550877d

Browse files
committed
fixed schedule job
1 parent 40d1046 commit 550877d

2 files changed

Lines changed: 18 additions & 20 deletions

File tree

src/Tender.Desktop/Services/CrawlerLauncher.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ private static async Task DrainAsync(StreamReader stream, CancellationToken ct)
104104
/// 2. 兄弟資料夾 ../crawler/Tender.Crawler.exe(MSI 安裝結構)
105105
/// 3. dev 環境相對路徑
106106
/// </summary>
107-
private static string? FindCrawlerExe()
107+
public static string? FindCrawlerExe()
108108
{
109109
var baseDir = AppContext.BaseDirectory;
110110

src/Tender.Desktop/ViewModels/AppSettingsViewModel.cs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using CommunityToolkit.Mvvm.Input;
44
using Tender.Core.Constants;
55
using Tender.Core.Models;
6+
using Tender.Desktop.Services;
67
using Tender.Storage.Repositories;
78

89
namespace Tender.Desktop.ViewModels;
@@ -105,10 +106,6 @@ private async Task SaveAsync(CancellationToken ct)
105106
return;
106107
}
107108

108-
// 偵測排程時間是否變更,若有變更則嘗試同步 Task Scheduler
109-
var oldSettings = await _repo.LoadAsync(ct);
110-
var scheduledTimeChanged = oldSettings.ScheduledTime != ScheduledTime;
111-
112109
var s = new AppSettings
113110
{
114111
ScheduledTime = ScheduledTime,
@@ -121,17 +118,11 @@ private async Task SaveAsync(CancellationToken ct)
121118
await _repo.SaveAsync(s, ct);
122119
HasUnsavedChanges = false;
123120

124-
if (scheduledTimeChanged)
125-
{
126-
var taskUpdated = TryUpdateScheduledTask(ScheduledTime);
127-
StatusMessage = taskUpdated
128-
? $"儲存成功,排程時間已更新為 {ScheduledTime}"
129-
: $"儲存成功,但更新 Task Scheduler 失敗(任務可能不存在或無權限),請手動執行「建立每日排程」捷徑";
130-
}
131-
else
132-
{
133-
StatusMessage = "儲存成功";
134-
}
121+
// 同步 Task Scheduler:不存在就建立、已存在就以新時間覆寫(/Create /F 同時涵蓋兩種情況)
122+
var taskOk = TryCreateOrUpdateScheduledTask(ScheduledTime);
123+
StatusMessage = taskOk
124+
? $"儲存成功,每日排程已設定為 {ScheduledTime}"
125+
: $"儲存成功,但建立排程失敗(可能找不到 Crawler 執行檔或權限不足)";
135126
}
136127
catch (Exception ex)
137128
{
@@ -140,17 +131,24 @@ private async Task SaveAsync(CancellationToken ct)
140131
}
141132

142133
/// <summary>
143-
/// 透過 schtasks /Change 修改既有任務的觸發時間
144-
/// 若任務不存在 / 沒權限會回傳 false
134+
/// schtasks /Create /F 建立或覆寫每日排程任務
135+
/// 屬於使用者層級任務(以目前登入帳號身份執行),不需 admin 權限
145136
/// </summary>
146-
private static bool TryUpdateScheduledTask(string hhmm)
137+
private static bool TryCreateOrUpdateScheduledTask(string hhmm)
147138
{
139+
var crawlerExe = CrawlerLauncher.FindCrawlerExe();
140+
if (crawlerExe is null) return false;
141+
148142
try
149143
{
150144
var psi = new System.Diagnostics.ProcessStartInfo
151145
{
152146
FileName = "schtasks.exe",
153-
Arguments = $"/Change /TN \"TenderSearch.DailyCrawl\" /ST {hhmm}",
147+
// /F = force overwrite,效果等於 create-or-update
148+
Arguments =
149+
$"/Create /SC DAILY /TN \"TenderSearch.DailyCrawl\" " +
150+
$"/TR \"\\\"{crawlerExe}\\\" --mode scheduled\" " +
151+
$"/ST {hhmm} /F",
154152
UseShellExecute = false,
155153
RedirectStandardOutput = true,
156154
RedirectStandardError = true,

0 commit comments

Comments
 (0)