Windows Server 2003上的PowerShell中的Get-ScheduledTask

时间:2013-08-22 18:14:39

标签: powershell scheduled-tasks

我有以下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上的计划任务及其状态?

5 个答案:

答案 0 :(得分: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年及以上,状态将返回启用,禁用,运行等

答案 1 :(得分:1)

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

#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 :(得分: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;
}

答案 3 :(得分:0)

您将在Working with scheduled tasks from Windows PowerShell中找到有关缺少的COM对象的所有信息。

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

答案 4 :(得分:0)

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

您可以在http://techibee.com/powershell/powershell-get-scheduled-tasks-list-from-windows-72008-computers/1647

找到用于查询所有计划任务(包括子文件夹中的计划任务)的代码示例