3

我有以下 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 上的状态?

4

5 回答 5

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 等。

于 2013-12-24T17:09:30.237 回答
2

下面是一个示例 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
}
于 2013-12-24T01:32:00.367 回答
1

如果您只想收集任务的基本属性,以便知道它的名称状态和下次运行时间,您可以通过以下方法使用 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;
}
于 2014-08-18T19:32:13.037 回答
0

您将在使用 Windows PowerShell 中的计划任务中找到您需要的有关缺少的 COM 对象的所有信息。

使用 Windows Server 2012,您可以在 Windows PowerShell 中使用计划任务 Cmdlet

于 2013-08-22T18:50:51.047 回答
0

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

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

于 2014-02-10T16:18:18.033 回答