2013-08-22 97 views
2

我有以下PowerShell代碼來驗證計劃任務是否存在並檢查其狀態。Windows Server 2003 PowerShell中的Get-ScheduledTask

$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. 

從我讀過似乎附表。服務COM對象在Server 2003上不存在。

那麼......是否有解決此問題的方法來驗證計劃任務及其在Server 2003上的狀態?

回答

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年及以上的,狀態將恢復啓用,禁用,跑步等

+0

我跑這個命令,它什麼也沒有顯示。請詳細說明如何使用它。 – Richard

+2

它將數組存儲在$ scheduledTasks變量中。 運行原始命令後,您可以通過輸出$ scheduledTasks來顯示陣列。 或者,您可以運行 'schtasks/query/v/fo csv | ConvertFrom-Csv' 查看輸出 – slidmac07

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; 
}