簡體   English   中英

powershell 查詢 windows 任務調度程序,用於將在特定日期時間之間運行的任務

[英]powershell query windows task scheduler for tasks that will run between specific datetimes

我繼承了一個服務器,它為數百個不同的進程運行 windows 計划任務(主要是它啟動自定義 PowerShell 腳本) - 這些任務的計划可以每 15 分鍾一次,或者在特定的每年一次日期。

如何使用 PowerShell (或實際上任何其他方式)查詢任務調度程序以確定將來是否有任何任務將在特定日期時間范圍內運行? 這是必要的,因此我們可以在此服務器以及與之交互的其他服務器上安排和執行維護。

這是獲取下一個正在運行的作業的腳本

Get-ScheduledTask |
   Foreach-object { Get-ScheduledTaskInfo $_} |
   where-object {!($_.NextRunTime -eq $null)} |
   Select-object Taskname, NextRunTime |
   Sort-object -property NextRunTime

歡迎來到 StackOverflow。 我建議您閱讀“我如何提出一個好問題” 你並不是真的在尋求幫助來解決問題。 你在問如何在一個新項目上破土動工。 也就是說,因為這是一個社區,所以我會告訴你一些我對這個主題的了解以及我對編寫這樣一個工具的最初想法。

我應該首先提到這是一個看似復雜的話題。 造成這種情況的原因很少,包括但不限於:

  1. 計划任務作為對象可能非常復雜,具有廣泛可變的計划、重復間隔、其他觸發類型和大量其他配置點。
  2. 非 GUI,即 CLI、cmdlet 和/或 API 工具多年來發生了變化。 而且,將它們串在一起來解決第 1 點中提到的復雜性並不總是那么容易。

警告:這份報告將很難寫。 在你開始這樣的挑戰之前,你應該尋找任何可以清點或為任務計划程序提供其他透明度的預先存在的工具。

此外,最好將維護 window 定義為政策問題。 然后您可以配置作業以避免 window。 乍一看,這讓我覺得這比編寫一個困難的程序來幫助挑選時隙要容易得多。

如果您選擇繼續前進,這里有一些工具可能會有所幫助:

  1. Schtasks.exe:一個功能驚人的 CLI 工具,已經存在了很長時間。
  2. TaskScheduler PowerShell 模塊:圍繞調度 COM 對象編寫的 PowerShell 模塊。 它最初是 Windows 7 PowerShell 包的一部分,但現在您可以通過 PowerShell 庫獲得它。 最簡單的方法是通過典型的模塊 cmdlet,如Find-ModuleInstall-Module
  3. 較新的 ScheduledTasks 模塊默認安裝在后來的 Windows 系統上。 它圍繞 Cim (WMI) 編寫,默認安裝在 PowerShell / Windows 的更高版本中。

注意:后兩種工具很容易混淆。 不僅名稱非常相似,而且它們所包含的命令之間也存在重疊和相似性。 例如,兩個模塊都有一個Get-Scheduledtask cmdlet。 處理混亂的兩種方法:

  1. 使用Import-Module cmdlet 導入模塊時,使用-Prefix參數將前綴添加到 cmdlet 的 none 部分。 然后在此后調用 cmdlet 時使用該前綴。
  2. 調用具有限定名稱的 cmdlet,例如TaskScheduler\GetScheduledTasks

現在來獲取調度數據。 根據我的經驗,所需的詳細信息僅通過任務的 XML 定義公開。 同樣,您將遇到各種調度和/或觸發選項帶來的復雜性。 您可以在此處閱讀有關 XML 架構的信息

以下是一些如何訪問 XML 數據的示例:

schtasks.exe /query /s pyexadm1 /tn <TaskName> /XML

在這種情況下,您必須進行額外的字符串操作以隔離 XML,然后將其轉換為[XML] ,以便您可以以典型的 PowerShell 方式使用它。 顯然,更廣泛地利用這一工具將面臨挑戰。 但是,了解快速檢查和工作非常方便,尤其是在下一個工具無法立即使用的情況下。

注意:如果您不引用/TN參數,所有任務都將返回。 雖然下一種方法更簡單,但了解這種方法很好,在您開發時會很方便。

下一個示例使用較舊的 TaskScheduler 模塊(上面的#2):

$TaskXML = [XML](TaskScheduler\Get-ScheduledTask -ComputerName <ComputerName>-Name <TaskName>).XML

注意:以上假設沒有使用前綴。 因此,您必須引用源模塊以防止與 ScheduledTask 模塊混淆。

此示例在一行中加載 XML 文本並將其轉換為 XmlDocument object。 然后您可以訪問有關任務的數據,如下所示:

$TaskXML.Task.Triggers.CalendarTrigger

這可能會產生 output ,如:

StartBoundary       Enabled ScheduleByWeek
-------------       ------- --------------
2020-09-14T08:00:00 true    ScheduleByWeek

您可以通過利用管道來大規模運行它,它可能如下所示:

$XMLTaskData = 
TaskScheduler\Get-ScheduledTask -ComputerName <ComputerName> -Recurse | 
ForEach-Object{ [XML]$_.XML }

在上面的管道示例中,生成的$XMLTaskData是一個數組,其中每個元素是一個相應的 XML 任務定義。

注意:使用-Recurse開關參數。 鑒於任務數量眾多,如果將它們組織到子文件夾中,我不會感到驚訝。

同樣,您也可以使用 ScheduledTasks 模塊中的Export-ScheduledTask cmdlet:

$TaskXML = [XML](Export-ScheduledTask -CimSession <ComputerName> -TaskName <TaskName>)

您可以像這樣利用管道:

$XMLTaskData = 
Get-ScheduledTask -CimSession <ComputerName> | 
Export-ScheduledTask | 
ForEach-Object{ [XML]$_ }

與其他管道示例一樣,這會產生一組 XML 任務定義。

注意:在這種情況下,沒有-Recurse參數。 不過,您可以專門引用路徑。

使用這些方法中的任何一種,您顯然都需要熟悉使用 PowerShell 中的 XML 對象,但是有大量的教程或其他資源。

同樣,這里的復雜性在於處理許多觸發器類型和調度范例。 在獲得最小可行程序 (MVP) 的過程中,您可能希望使用這些技術來清點現有任務。 這可以幫助您確定開發過程的優先級。

最后一點; 知道任務何時運行可能與知道它何時運行完全不同。 例如,一項任務可能在下午 1:00 運行,但作業的持續時間是可變的且無法解釋。 這讓我覺得很難應付。 您可能需要另一個過程來在事件日志中查找任務完成事件。 您可能還需要考慮可以在 XML 數據中找到的執行時間限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM