我有以下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上的计划任务及其状态?
答案 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
找到用于查询所有计划任务(包括子文件夹中的计划任务)的代码示例