Powershell 管理 后臺/計劃 作業(六)
管理 后臺/計劃 作業
后臺作業
以其他方式啟動三種類型的作業(即本地、遠程和通用信息模型 (CIM)/Windows Management Instrumentation (WMI))
本地作業
- 運行位置:本地計算機
- 關鍵點:用
Start-Job啟動,腳本在后臺進程運行 - 語法:
# 運行命令塊
Start-Job -ScriptBlock { Get-Process } -Name MyJob
# 運行一個腳本文件
Start-Job -FilePath "C:\scripts\backup.ps1" -Name BackupJob
遠程作業
- 運行位置:遠程計算機
- 關鍵點:用
Invoke-Command,加-AsJob參數 - 語法:
Invoke-Command -ComputerName Server01,Server02 `
-ScriptBlock { Get-Service } `
-AsJob -JobName "ServiceCheck"
用途:批量對多臺服務器執行任務,例如檢查服務狀態、收集日志。
注意:這需要遠程計算機啟用 PowerShell Remoting (Enable-PSRemoting)。
CIM / WMI 作業
- 運行位置:通過 WMI/CIM 通道執行命令(不依賴 PS Remoting)。
- 關鍵點:
- CIM 命令自身 沒有 -AsJob 參數,所以要用
Start-Job包裝。 - WMI 命令(Get-WmiObject)有
-AsJob參數,可以直接用。
- CIM 命令自身 沒有 -AsJob 參數,所以要用
CIM 示例
在后臺查詢本地/遠程的操作系統信息。
Start-Job -ScriptBlock { Get-CimInstance -ClassName Win32_OperatingSystem }
WMI 示例
在后臺通過 WMI 查詢遠程機器的服務。
Get-WmiObject -Class Win32_Service -ComputerName Server01 -AsJob
在上述所使用到的類型名,都可以自己去找:
# WMI
Get-WmiObject -List
# CIM
Get-CimClass
作業的管理
- 父作業 (Parent Job)
- 頂級容器,代表整個作業。
- 里面會有一個或多個子作業。
- 子作業 (Child Job)
- 每臺計算機對應一個子作業。
- 本地作業 = 1 個子作業。
- 遠程作業 / WMI 作業 = 每個目標計算機 1 個子作業。
舉例:
如果你用 Invoke-Command -AsJob 發到 3 臺電腦:
- 父作業 1 個
- 子作業 3 個(分別對應三臺遠程機)
Get-Job= 看隊列Receive-Job= 拿結果Wait-Job= 等待任務完成Remove-Job= 清理任務Stop-Job= 停止任務
檢索作業
- 列出所有作業
Get-Job
- 按名稱找作業
Get-Job -Name TestScript
- 按 ID 找作業
Get-Job -Id 5
狀態 State 屬性 很關鍵:
Running(正在運行)Completed(已完成)Failed(失敗)Stopped(被手動終止)
注意:父作業的狀態會反映子作業中有沒有失敗。
即便 3 臺機器里有 2 個成功,1 個失敗 → 父作業顯示 Failed。
查看子作業
- 展開 ChildJobs 屬性
Get-Job -Name RemoteLogs | Select-Object -ExpandProperty ChildJobs - 更直觀的參數 (PowerShell 3.0+)
Get-Job -Name RemoteLogs -IncludeChildJobs
這樣你就能看到每個子作業的 獨立狀態、ID、Location。
簡單案例
常用管理命令:
- 停止作業
Stop-Job -Name RemoteLogs Stop-Job -Id 6
- 刪除作業(清理內存里的結果)
Remove-Job -Name LocalDirectory
- 等待作業完成(腳本常用)
Wait-Job -Name TestScript
- 獲取作業結果
Receive-Job -Id 4
- 檢索正在執行的任務的結果
指定 –Keep,否則后續再讀取就讀取不到了
Receive-Job –ID 13 -Keep | Format-Table –Property Name,Length
注意:
Receive-Job 默認會“取走”結果,再次執行就讀不到了。
如果要多次讀取,可以加 -Keep:
Receive-Job -Id 4 -Keep
表格總結回顧:
| 命令 | 作用 |
|---|---|
Get-Job |
查看所有作業(父作業 + 狀態) |
Get-Job -IncludeChildJobs |
查看子作業詳情 |
Stop-Job |
停止正在運行的作業 |
Remove-Job |
刪除作業對象(釋放內存) |
Wait-Job |
等待作業完成(腳本控制流用) |
Receive-Job |
獲取作業結果 |
計劃作業
一個計劃作業由 三部分組成:
- 作業 (Job):要運行的命令或腳本。
- 類似于
Start-Job -ScriptBlock { … }。
- 類似于
- 作業選項 (Job Options):運行的附加條件。
- 比如:是否需要憑據、網絡可用性要求、最大運行時間等。
- 用
New-ScheduledJobOption創建。
- 作業觸發器 (Job Triggers):定義什么時候運行。
- 比如:每天 9 點運行,或每周一運行,或只運行一次。
- 用
New-JobTrigger創建。
若要查看完整的命令列表,請運行以下命令:
Get-Command –Module ScheduledTasks
常用命令:
| Cmdlet | 說明 |
|---|---|
Register-ScheduledJob |
創建計劃作業(關鍵命令) |
Get-ScheduledJob |
查看計劃作業 |
Set-ScheduledJob |
修改作業 |
Enable-ScheduledJob / Disable-ScheduledJob |
啟用/禁用作業 |
Unregister-ScheduledJob |
刪除計劃作業 |
Get-JobTrigger / Add-JobTrigger |
查看或添加觸發器 |
Get-ScheduledJobOption / Set-ScheduledJobOption |
查看或修改選項 |
Get-Job / Receive-Job |
查看計劃作業的運行結果 |
作業選項
使用 New-ScheduledJobOption 可創建新的作業選項對象
此命令具有多個參數,可用于定義作業的選項,例如:
- –HideInTaskScheduler,阻止作業在“任務計劃程序”中顯示。 如果未包括此選項,最終作業將在“任務計劃程序”圖形用戶界面 (GUI) 中顯示。
- –RunElevated,將作業配置為在提升的權限下運行。
- –WakeToRun,在作業計劃運行時喚醒計算機。
使用其他參數來配置在計算機空閑時運行的作業和其他選項。 許多參數與“任務計劃程序”GUI 中的選項對應。
使用以下命令創建新的選項對象并將其存儲在變量中:
$opt = New-ScheduledJobOption –RequireNetwork –RunElevated -WakeToRun
作業觸發器
作業觸發器定義作業何時運行。 每個作業可以有多個觸發器。 使用 New-JobTrigger 命令創建觸發器對象。 有五種基本類型的觸發器:
- –Once 指定只運行一次的作業。 還可以指定 –RandomDelay,并且必須指定 –At 參數來定義作業何時運行。 此參數接受 System.DateTime 對象或可解釋為日期的字符串。
- –Weekly 指定每周運行的作業。 可指定 –RandomDelay,并且必須同時指定 –At 和 –DaysOfWeek 參數。 –At 采用日期和時間來定義作業何時運行。 –DaysOfWeek 采用一周中的某一天或多天來運行作業。 通常會用 –At 來指定時間并使用 –DaysOfWeek 定義作業應該運行的天數。
- –Daily 指定每天運行的作業。 必須指定 –At 并指定作業何時運行。 還可以指定 –RandomDelay。
- –AtLogOn 指定用戶登錄時運行的作業。 此類作業類似于登錄腳本,不同之處在于它是在本地而非在域中定義。 可指定 –User 來限制觸發作業的用戶帳戶,并指定 –RandomDelay 來添加隨機延遲。
- AtStartUp 與 –AtLogOn 類似,不同之處在于它在計算機啟動時運行作業。 這通常會在用戶登錄前運行作業。
例如,以下命令創建一個觸發器,該觸發器在當地時間每周一和周四下午 3:00 運行:
$trigger = New-JobTrigger -Weekly -DaysOfWeek Monday,Thursday -At '3:00PM'
創建和注冊
使用 Register-ScheduledJob 可創建和注冊新的計劃作業。 指定以下任何參數:
- –Name 是必需的,它指定作業的顯示名稱。
- –ScriptBlock 是必需的,它指定作業運行的一個或多個命令。 還可以指定 –FilePath 并提供作業將運行的 Windows PowerShell 腳本文件的路徑和名稱。
- –Credential 是可選的,它指定將用于運行作業的用戶帳戶。
- –InitializationScript 接受可選的腳本塊。 此腳本塊中的一個或多個命令將在作業開始之前運行。
- –MaxResultCount 是可選的,它指定要存儲在磁盤上的最大結果集數。 達到此數量后,shell 會刪除舊結果,用于為新結果騰出空間。 -MaxResultCount 參數的默認值為 32。
- –ScheduledJobOption 接受作業選項對象。
- –Trigger 接受作業觸發器對象。
若要使用 $opt 中的選項對象和 $trigger 中的觸發器對象注冊新作業,請使用以下示例:
$opt = New-ScheduledJobOption -WakeToRun
$trigger = New-JobTrigger -Once -At (Get-Date).AddMinutes(5)
Register-ScheduledJob -Trigger $trigger -ScheduledJobOption $opt -ScriptBlock { Dir C:\ } -MaxResultCount 5 -Name "LocalDir"
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 LocalDir 1 Dir C:\ True
Windows PowerShell 在 Windows“任務計劃程序”中注冊生成的作業,并在磁盤上創建作業定義。 作業定義是存儲在您的用戶配置文件文件夾中的 XML 文件,路徑為 \AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs。
可以運行 Get-ScheduledJob 來查看本地計算機上的計劃作業列表。
如果知道計劃作業的名稱,可以使用 Get-JobTrigger 和 –Name 參數來檢索此作業的觸發器列表。
使用流程
步驟 1:定義觸發器
每天上午 9 點運行
$trigger = New-JobTrigger -Daily -At 9am
步驟 2:定義選項
管理員權限運行,即使在筆記本電池模式下也能繼續(參數:ContinueIfGoingOnBattery)
$options = New-ScheduledJobOption -RunElevated -ContinueIfGoingOnBattery
步驟 3:注冊作業
創建一個每天 9 點運行的作業,把 Get-ChildItem 的結果保存到磁盤
Register-ScheduledJob -Name "DailyDirJob" -ScriptBlock { Get-ChildItem C:\ -Recurse } -Trigger $trigger -ScheduledJobOption $options
查看與管理
查看作業定義
Get-ScheduledJob
查看觸發器和選項
Get-JobTrigger -Name DailyDirJob
Get-ScheduledJobOption -Name DailyDirJob
手動運行一次
Start-Job -DefinitionName DailyDirJob
查看結果
Get-Job -Name DailyDirJob
Receive-Job -Name DailyDirJob -Keep
刪除作業
Unregister-ScheduledJob -Name DailyDirJob
與任務計劃程序的關系
計劃作業在 任務計劃程序 中存儲在:
Microsoft\Windows\PowerShell\ScheduledJobs
在任務計劃程序 GUI 里能看到對應的任務:
- 觸發器 = 作業觸發器
- 條件/常規 = 作業選項
- 歷史記錄 = 執行日志
注意:如果你在任務計劃程序 GUI 里修改了觸發器或條件,這些修改會影響后續的所有運行。
區分 PSScheduledJob vs ScheduledTasks 模塊
-
PSScheduledJob:專門給 PowerShell 用的“計劃作業”,結果保存到 PowerShell 自己的輸出存儲中,可以
Receive-Job。 -
ScheduledTasks:Windows 原生任務計劃程序管理模塊,可以操作所有任務(包括 PowerShell 以外的任務)。
本文來自博客園,作者:竹等寒,轉載請注明原文鏈接。

浙公網安備 33010602011771號