33using CommunityToolkit . Mvvm . Input ;
44using Tender . Core . Constants ;
55using Tender . Core . Models ;
6+ using Tender . Desktop . Services ;
67using Tender . Storage . Repositories ;
78
89namespace 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