【问题标题】:Get-ScheduledTask in PowerShell on Windows Server 2003Windows Server 2003 上 PowerShell 中的 Get-ScheduledTask
【发布时间】:2026-02-16 23:50:01
【问题描述】:

我有以下 PowerShell 代码来验证计划任务是否存在并检查其状态。

$SchTsk = Get-ScheduledTask | Select Name, State | ? {$_.Name -eq $SchTask}
If ($SchTsk -ne $Null)
{
  Write-Host "SchTask $SchTask exists"
  If ($SchTsk.State -eq 3)
  {
    Write-Host "SchTask State: READY!"
  }
}

该代码在 Windows Server 2008 上运行良好,但在 Windows Server 2003 上无法运行。在 2003 年出现错误:

New-Object : Cannot load COM type Schedule.Service.

根据我的阅读,Server 2003 上似乎不存在 Schedule.Service COM 对象。

那么...是否有解决此问题的方法来验证计划任务及其在 Server 2003 上的状态?

【问题讨论】:

    标签: powershell scheduled-tasks


    【解决方案1】:

    以下是一个示例 PowerShell 脚本,它从上述 COM 对象中读取并输出一些任务计划信息:

    #Connecting to COM Object 
    $schedService = New-Object -ComObject Schedule.Service 
    $schedService.Connect($Computer) 
    
    # Get Scheduled Tasks on Root Folder (Task Scheduler Library)
    $folder = $SchedService.GetFolder("") 
    $tasks = $folder.GetTasks("") 
    
    # Output Task Details
    $tasks | % { 
      "-" * 40
      "Task " + $_.Name + ":"
      "-" * 40
      $_.Definition.Actions
    }
    

    【讨论】:

      【解决方案2】:

      我在 Win2008 和 Win2003 上运行 PowerShell 脚本,发现命令“schtasks”足以查找有关计划任务的信息。这不是 powershell 命令,但它是 Windows 中的标准功能,并且与 Windows 2003 和 2008 兼容。

      $scheduledTasks = schtasks /query /v /fo csv | ConvertFrom-Csv
      #this will return an array of scheduled tasks with all info available for the task
      

      要检查计划任务是否在 2003 年准备就绪,您需要确保“计划任务状态”为“已启用”,并且状态为空白。

      在 2008 及更高版本上,Status 将返回 enabled、disabled、running 等。

      【讨论】:

      • 我运行了这个命令,它什么也没显示。请详细说明如何使用。
      • 它将数组存储在 $scheduledTasks 变量中。您可以在运行原始命令后通过输出 $scheduledTasks 来显示数组。或者,您可以运行 schtasks /query /v /fo csv | ConvertFrom-Csv 来查看输出
      【解决方案3】:

      如果您只想收集任务的基本属性,以便了解它的名称状态和下次运行时间,您可以通过以下方法使用 schtasks:

      function New-TaskInfo()
      {
          param ($TaskPath, $TaskName, $NextRunTime, $Status);
      
          $task = new-object PSObject;
      
          $task | add-member -type NoteProperty -Name Path-Value $TaskPath;
          $task | add-member -type NoteProperty -Name Name -Value $TaskName;
          $task | add-member -type NoteProperty -Name NextRunTime -Value $NextRunTime;
          $task | add-member -type NoteProperty -Name Status -Value $Status;
      
          return $task;
      }
      
      
      function Get-ScheduledTaskInfo
      {
          $tasks = @();
          $queryOutput = schtasks /QUERY /FO CSV
          foreach($line in $queryOutput) 
          {
              $columns = $line.Split(','); 
              $taskPath = $columns[0].Replace('"', '');
              if($taskPath -eq "TaskName")
              {
                  #Ignore headder lines
                  continue;
              }
              $taskName = [System.IO.Path]::GetFileName($taskPath);
              $nextRunTime = $columns[1].Replace('"', '');
              $status = $columns[2].Replace('"', '');
              $task = New-TaskInfo -TaskPath $taskPath -TaskName $taskName -NextRunTime $nextRunTime -Status $status;
              Write-Host -ForegroundColor Green "Add Task $task";
              $tasks += $task;
          }
          return $tasks;
      }
      

      如果您想为特定任务执行操作,您可以使用 schtasks 直接指定存储在之前收集的对象中的数据。

      $task = Get-ScheduledTaskInfo | Where-Object {$_.Name -eq 'TaskName'}
      if($task.Status -eq 'Ready')
      {
          Write-Host -ForegroundColor Green "Task" $task.Name "Is" $task.Status;
      
          #End the target task
          schtasks /END /TN $task.Path;
      }
      

      【讨论】:

        【解决方案4】:

        您可以在Working with scheduled tasks from Windows PowerShell 中找到有关丢失的 COM 对象所需的所有信息。

        使用 Windows Server 2012,您可以使用Scheduled Tasks Cmdlets in Windows PowerShell

        【讨论】:

        • 感谢 JPBlanc。第一个链接有点帮助。我至少可以查询任务名称并确保它存在,但似乎不允许我查询任务状态,只能查询状态。干杯!
        【解决方案5】:

        @ameer deen.. 您提供的代码仅返回根级别的任务。 Windows 2008 以后对任务管理器进行了一些修改,其中之一是文件夹结构。要同时列出子文件夹中的所有任务,我们需要查询子文件夹并遍历它们。

        您可以在http://techibee.com/powershell/powershell-get-scheduled-tasks-list-from-windows-72008-computers/1647找到查询所有(包括子文件夹中的)计划任务的代码示例

        【讨论】:

          最近更新 更多