首頁 > 軟體

批次處理bat系統管理之任務計劃篇

2022-10-28 14:02:03

本文主要介紹使用 at 和 schtasks 兩個命令實現常見任務計劃的增刪查改等操作。其中 at 命令功能比較單一,可以設定的任務計劃的屬性較少,多用於 XP 等老系統;相比之下 schtasks 的功能較為豐富,Win7 / Win10 等系統建議使用 schtasks 命令管理任務計劃。

對於 Windows 系統管理員來說,經常遇到的操作可能包括:

程序
服務
登入檔
任務計劃
防火牆
網路
使用者和組
共用
FTP

一方面,初學批次處理指令碼的朋友們往往習慣於通過goto等死迴圈的方式實現每隔XX時間執行一次某命令,這樣的方式只適合練習一下語法或者在自己電腦上做個小試驗。如果要放在公司的伺服器上,是不太合適的,因為這種死迴圈的方式太浪費系統資源。推薦的方式是把指令碼放在任務計劃裡面定期執行。

另一方面,某些惡意指令碼也喜歡建立任務計劃定時執行惡意操作,某些討厭的軟體也經常通過任務計劃定期更新版本或彈窗等。熟練掌握相關命令列的操作,也有助於解決此類問題。

1. at 命令

1.1 at 命令基本語法

at [\computername] [ [id] [/delete] | /delete [/yes]]
at [\computername] time [/interactive] [ /every:date[,...] | /next:date[,...]] "command"

常用參數列:

\computername指定遠端計算機。如果省略這個引數,會計劃在本地計算機上執行命令。
id指定給已計劃命令的識別號。
/delete刪除某個已計劃的命令。如果省略 id,計算機上所有已計劃的命令都會被刪除。
/yes不需要進一步確認時,跟刪除所有作業的命令一起使用。
time指定執行命令的時間。(24小時計時法00:00到23:59)
/interactive允許作業在執行時,與當時登入的使用者桌面進行互動。
/every:date[,...]指定在每週(m,t,w,th,f,s,su分別代表週一到週日)或每月的特定日期(1到31)執行命令。如果省略日期,則預設為在每月的本日執行。
/next:date[,...]指定在下一個指定日期(如,下週四)執行命令。如果省略日期,則預設為在每月的本日執行。
"command"準備執行的命令或批次程式。

1.2 at 建立任務計劃

# 今天下午2:30自動關機

at 14:30 shutdown /s /f /t 0

# 每天晚上11點自動關機

at 23:00 /every:m,t,w,th,f,s,su shutdown /s /f /t 0

# 每週一到週五早上9點執行指令碼 C:Test Backup.bat

at 09:00 /every:m,t,w,th,f cmd /c "C:Test Backup.bat"

例如 C:Test Backup.bat 指令碼內容是:

@echo off
if not exist "E:Log" (
    md "E:Log"
)
copy /y "C:WindowsWindowsUpdate.log" "E:Log"

1.3 檢視 at 建立了哪些任務計劃

直接執行 at 命令不帶任何引數即可。

C:>at
狀態 ID     日期                    時間          命令列
-------------------------------------------------------------------------------
        1   今天                    14:30         shutdown /s /f /t 0
        2   每月執行日期:...        23:00         shutdown /s /f /t 0
        3   每月執行日期:...        9:00          cmd /c "C:Test Backup.bat"

1.4 刪除ID為2的 at 任務計劃

at 2 /delete /yes

1.5 刪除所有的 at 任務計劃

at /delete /yes

1.6 獲得 SYSTEM 許可權的命令列視窗

XP 系統有個小技巧,可以用 at 命令獲取一個系統許可權的命令列視窗,通常可以使用這個方法結束某些惡意程序、刪除某些頑固檔案等。假如現在的時間為16:46,執行下面的命令,會在一分鐘後開啟一個 SYSTEM 許可權的命令列視窗。

at 16:47 /interactive %ComSpec%

2. schtasks 命令

2.1 schtasks 命令基本語法

schtasks /create建立新任務計劃
schtasks /delete刪除任務計劃
schtasks /query顯示所有任務計劃
schtasks /change更改任務計劃屬性
schtasks /run按需執行任務計劃
schtasks /end中止當前正在執行的任務計劃
schtasks /showsid顯示與計劃的任務名稱相應的安全識別符號

2.2 schtasks 建立任務計劃

schtasks /create 命令的主要引數:

/tn指定任務的名稱。
/tr指定任務執行的程式或命令。
/sc指定計劃型別。有效值為 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE。
/mo指定任務在其計劃型別內的執行頻率。這個引數對於 MONTHLY 計劃是必需的。對於 MINUTE、HOURLY、DAILY 或 WEEKLY 計劃,這個引數有效,但也可選。預設值為 1。
/d指定周或月的一天。只與 WEEKLY 或 MONTHLY 計劃共同使用時有效。
/m指定一年中的一個月。有效值是 JAN ~ DEC 和 * (每個月)。/m 引數只對於 MONTHLY 計劃有效。在使用 LASTDAY 修飾符時,這個引數是必需的。否則,它是可選的,預設值是 * (每個月)。
/i指定任務啟動之前計算機空閒多少分鐘。鍵入一個 1 ~ 999 之間的整數。這個引數只對於 ONIDLE 計劃有效,而且是必需的。 
/st以 HH:MM:SS 24 小時格式指定時間。預設值是命令完成時的當前本地時間。/st 引數只對於 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY 和 ONCE 計劃有效。它只對於 ONCE 計劃是必需的。
/sd以 YYYY/MM/DD 格式指定任務啟動的日期。預設值是當前日期。/sd 引數對於所有的計劃有效,但只對於 ONCE 計劃是必需的。
/ed指定任務計劃執行的最後日期。此引數是可選的。它對於 ONCE、ONSTART、ONLOGON 或 ONIDLE 計劃無效。預設情況下,計劃沒有結束日期。
/s指定遠端計算機的名稱或 IP 地址(帶有或者沒有反斜槓)。預設值是本地計算機。
/u使用特定使用者帳戶的許可權執行命令。預設情況下,使用已登入到執行 SchTasks 的計算機上的使用者的許可權執行命令。
/p指定在 /u 引數中指定的使用者帳戶的密碼。如果使用 /u 引數,則需要該引數。
/ru使用指定使用者帳戶的許可權執行任務。預設情況下,使用使用者登入到執行 SchTasks 的計算機上的許可權執行任務。
/p指定使用者帳戶的密碼,該使用者帳戶在 /u 引數中指定。如果在指定使用者帳戶的時候忽略了這個引數,SchTasks.exe 會提示您輸入密碼而且不顯示鍵入的文字。使用 NT AuthoritySystem 帳戶許可權執行的任務不需要密碼,SchTasks.exe 也不會提示索要密碼。
/xml從檔案的指定任務 XML 中建立任務。
/f如果指定的任務已經存在,則強制建立任務並抑制警告。

# 每天晚上8點30分關機

schtasks /create /tn "BatHome Job 2.2.01" /tr "shutdown /s /f /t 0" /sc daily /st 20:30:00 /ru System

注:伺服器上的普通使用者或管理員使用者通常強制要求定期更改密碼,更改密碼之後,該使用者建立的任務計劃將會無法執行,需要手工更改儲存在任務中的密碼。建立任務計劃的時候指定使用 System 使用者將不存在定期更改密碼的問題。

# 每10分鐘執行一次某個指令碼

schtasks /create /tn "BatHome Job 2.2.02" /tr """"C:Test2.2.02 Backup.bat"""" /sc minute /mo 10 /ru System

注:待執行的程式路徑中包含空格等特殊字元的情況下,需要增加額外的雙引號。

# 每小時過三分的時候執行一次

schtasks /create /tn "BatHome Job 2.2.03" /tr "C:Test2.2.03.bat" /sc hourly /st 00:03:00 /ru System

注:因為忽略了 /mo 引數,命令使用了小時計劃的預設值,即每1小時執行一次。

# 從某天開始每三小時執行一次

schtasks /create /tn "BatHome Job 2.2.04" /tr "C:Test2.2.04.bat" /sc hourly /mo 3 /sd 2022/09/29 /ru System

注:使用 /mo 引數來指定間隔時間,使用 /sd 引數來指定起始日期。由於命令沒有指定起始時間,當前時間被用作起始時間。

# 每天執行一次直到某天為止

schtasks /create /tn "BatHome Job 2.2.05" /tr "C:Test2.2.05.bat" /sc daily /st 09:00:00 /ed 2022/12/31 /ru System

注:忽略了 /mo 引數,所以使用預設間隔 1 來每天上午9點執行命令。使用 /ed 引數指定到2022年12月31日結束。

# 從某天開始每隔一天執行一次

schtasks /create /tn "BatHome Job 2.2.06" /tr "C:Test2.2.06.bat" /sc daily /mo 2 /st 15:00:00 /sd 2022/09/29 /ru System

注:使用 /mo 引數來指定 2 天的間隔。

# 每三週執行一次
schtasks /create /tn "BatHome Job 2.2.07" /tr "C:Test2.2.07.bat" /sc weekly /mo 3 /ru System
# 每月的第一天執行
schtasks /create /tn "BatHome Job 2.2.08" /tr "C:Test2.2.08.bat" /sc monthly /ru System
# 每月的最後一天執行
schtasks /create /tn "BatHome Job 2.2.09" /tr "C:Test2.2.09.bat" /sc monthly /mo lastday /m * /ru System
# 每月的第三個週五執行
schtasks /create /tn "BatHome Job 2.2.10" /tr "C:Test2.2.10.bat" /sc monthly /mo third /d fri /ru System
# 第四季度每月的第三天執行
schtasks /create /tn "BatHome Job 2.2.11" /tr "C:Test2.2.11.bat" /sc monthly /d 3 /m oct,nov,dec /ru System
# 指定日期時間執行一次
schtasks /create /tn "BatHome Job 2.2.12" /tr "C:Test2.2.12.bat" /sc once /st 22:00:00 /sd 2022/09/29 /ru System
# 每次系統啟動的時候執行
schtasks /create /tn "BatHome Job 2.2.13" /tr "C:Test2.2.13.bat" /sc onstart /ru System
# 每當使用者登入的時候執行
schtasks /create /tn "BatHome Job 2.2.14" /tr "C:Test2.2.14.bat" /sc onlogon /ru System
# 空閒指定時長的時候執行
schtasks /create /tn "BatHome Job 2.2.15" /tr "C:Test2.2.15.bat" /sc onidle /i 15 /ru System

注:使用 /i 引數指定系統空閒15分鐘後執行。

2.3 schtasks 修改任務計劃

schtasks /change /tn TaskName [/s computer [/u [domain]user /p password]] [/tr TaskRun] [/ru [Domain]User | "System"] [/rp Password]

2.4 schtasks 立即執行任務計劃

schtasks /run /tn TaskName [/s computer [/u [domain]user /p password]]

注:忽略原有計劃,立即執行任務計劃。不會更改任務計劃好的下次執行時間。

2.5 schtasks 終止由任務啟動的程式

schtasks /end /tn TaskName [/s computer [/u [domain]user /p password]]

2.6 schtasks 檢視任務計劃

schtasks [/query] [/fo {TABLE | LIST | CSV}] [/nh] [/v] [/s computer [/u [domain]user /p password]]

注:Win7 命令列視窗的中文狀態下 schtasks /query 可能會出錯,可以先用chcp命令切換到英文。

chcp 437
schtasks /query

2.7 schtasks 刪除任務計劃

schtasks /delete /tn {TaskName | *} [/f] [/s computer [/u [domain]user /p password]]
# 刪除指定名稱的任務計劃
schtasks /delete /tn "GoogleUpdateTaskMachineUA" /f
# 刪除所有的任務計劃
schtasks /delete /tn * /f

注:慎重執行!系統有很多預設的任務計劃,請做好充分的備份。

2.8 沒有引數對應的屬性如何修改

例如:沒有哪個引數可以設定“如果任務執行時間超過以下時間,停止任務”

1) 建立任務計劃:

schtasks /create /tn "BatHome Job 2.8.01" /tr "C:Test2.8.01.bat" /sc daily /mo 1 /st 15:14 /ru System

2) 開啟任務計劃程式圖形介面,手工設定好超時時間,然後匯出xml

# 預設值是3天:
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
# 修改成1小時之後:
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>

3) 用修改後的xml檔案去建立任務計劃

schtasks /create /ru System /tn "BatHome Job 2.8.02" /xml "C:Test2.8.02.xml"

使用bat檔案建立系統的任務計劃程式

最近由於需要在電腦上新增任務計劃用來呼叫自己的指令碼,由於使用一段是時間後需要重灌系統,有需要重新進行設定,感覺很麻煩,沒有雙擊一下檔案就能建立好的方便。
下面是指令碼的內容,建立完成後,在電腦啟動後3分鐘時執行,目標路徑下的bat指令碼。
可以根據自己的需求修改

@echo off
set curDir=C:UsersAdministratorDesktoptest

schtasks /create /tn record  /ru system /tr "'%curDir%sclect.bat'" /sc onStart  /delay 0003:00 /rl highest /F /np

@echo on

簡單說一下我瞭解的幾個引數吧,具體的太複雜了沒專門去研究。
/ru system :加上這個的話建立的任務計劃就是system使用者建立的,刪除這個引數的話執行就是當前使用者建立的任務
/tr "'%curDir%sclect.bat'":是萬用字元的指令碼路徑,由於有的直接輸入時會有問題,特殊字元等等導致無法執行,因此經路徑拆分處理,這裡拼接一下可以很方便的解決。
/delay 0003:00:這個應該就是啟動後延時3分鐘啟動,沒有專門研究,可以根據自己的需求修改(0010:00,啟動後延遲10分鐘 ;0000:00啟動後不延遲)
其他的我就不太清楚了,解讀到此結束,希望對大家有幫助。

到此這篇關於批次處理bat系統管理之任務計劃篇的文章就介紹到這了,更多相關bat任務計劃內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com