动态

详情 返回 返回

Powershell 管理 後台/計劃 作業(六) - 动态 详情

目錄
  • 管理 後台/計劃 作業
    • 後台作業
      • 本地作業
      • 遠程作業
      • CIM / WMI 作業
      • 作業的管理
        • 檢索作業
        • 查看子作業
        • 簡單案例
    • 計劃作業
      • 作業選項
      • 作業觸發器
      • 創建和註冊
      • 使用流程
      • 查看與管理
      • 與任務計劃程序的關係
      • 區分 PSScheduledJob vs ScheduledTasks 模塊

管理 後台/計劃 作業

後台作業

以其他方式啓動三種類型的作業(即本地、遠程和通用信息模型 (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 示例
在後台查詢本地/遠程的操作系統信息。

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 獲取作業結果

計劃作業

一個計劃作業由 三部分組成:

  1. 作業 (Job):要運行的命令或腳本。
    • 類似於 Start-Job -ScriptBlock { … }
  2. 作業選項 (Job Options):運行的附加條件。
    • 比如:是否需要憑據、網絡可用性要求、最大運行時間等。
    • New-ScheduledJobOption 創建。
  3. 作業觸發器 (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 以外的任務)。

Add a new 评论

Some HTML is okay.