2013-03-15 20 views
8

是否有人有使用PowerShell清點服務器上計劃任務的鏈接或腳本,包括Action?如何使用PowerShell清點計劃任務

我能夠獲得Scheduled Service com對象以及我所謂的「頂級」屬性(名稱,狀態,lastruntime),但也希望從「計劃任務」的「操作」部分獲取信息(本質上是預定任務的名稱及其命令行)。

例如:

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0) 

$tasks | select Name, LastRunTime 

foreach ($t in $tasks) 
{ 
foreach ($a in $t.Actions) 
{ 
    $a.Path 
} 
} 

上面的代碼片段中列出的任務方面的工作;但Actions上的循環根本沒有做任何事情,沒有錯誤,也沒有任何輸出。

任何幫助,將不勝感激。

回答

11

這可能是非常類似於目前的答案,但我寫了一個快速的腳本,讓你去。當前腳本的問題是任務中沒有Actions屬性。您需要從comobject提供的xml任務定義中提取它。以下腳本將返回一個對象數組,每個計劃任務一個。如果動作是運行一個或多個命令,則包括動作。這只是爲了讓你走,所以你需要修改它,以包括更多的屬性,如果你需要它們。

function getTasks($path) { 
    $out = @() 

    # Get root tasks 
    $schedule.GetFolder($path).GetTasks(0) | % { 
     $xml = [xml]$_.xml 
     $out += New-Object psobject -Property @{ 
      "Name" = $_.Name 
      "Path" = $_.Path 
      "LastRunTime" = $_.LastRunTime 
      "NextRunTime" = $_.NextRunTime 
      "Actions" = ($xml.Task.Actions.Exec | % { "$($_.Command) $($_.Arguments)" }) -join "`n" 
     } 
    } 

    # Get tasks from subfolders 
    $schedule.GetFolder($path).GetFolders(0) | % { 
     $out += getTasks($_.Path) 
    } 

    #Output 
    $out 
} 

$tasks = @() 

$schedule = New-Object -ComObject "Schedule.Service" 
$schedule.Connect() 

# Start inventory 
$tasks += getTasks("\") 

# Close com 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($schedule) | Out-Null 
Remove-Variable schedule 

# Output all tasks 
$tasks 

Ex。的輸出

PS > .\Untitled1.ps1 | ? { $_.Name -eq "test" } 


Actions  : notepad.exe c:\test.txt 
       calc.exe 
Path  : \test 
Name  : test 
LastRunTime : 30.12.1899 00:00:00 
NextRunTime : 17.03.2013 13:36:38 
+0

謝謝,那幫助非常大!我想我一直很難將東西翻譯成Powershell(來自C#和.NET背景),或者找到可以讓你知道PS腳本的對象模型的文檔。 – 2013-03-18 14:20:31

+3

'Get-Member'是探索新類型時的朋友:)例: '$任務| Get-Member'會給你'$ tasks'數組中對象的屬性,方法等。 – 2013-03-18 15:48:06

1

獲取從W7 RK的PowerShellPack,並試圖獲得-scheduledtask

http://archive.msdn.microsoft.com/PowerShellPack

摘自MSDN:

Windows 7的資源工具包的PowerShell包包含10個模塊做各種有趣的PowerShell的東西。 Import-Module PowerShellPack實際上導入了10個模塊供您使用。以下是每個模塊的簡要概述。

  • WPK從Windows PowerShell快速輕鬆地創建豐富的用戶界面。認爲HTA,但很容易。超過600個的腳本來幫助您建立快速的用戶界面
  • 的TaskScheduler列表計劃任務,創建或刪除任務
  • 文件系統監控文件和文件夾,檢查是否有重複的文件,並檢查磁盤空間
  • IsePack使用超過35種快捷方式在集成腳本環境中增強腳本功能
  • DotNet探索加載類型,查找可以使用類型的命令,並探索如何使用PowerShell,DotNet和COM一起
  • PSImageTools轉換,旋轉,縮放和裁切圖像,並獲得圖像元數據
  • PSRSS線束從PowerShell中的FeedStore中
  • PSSystemTools獲取操作系統或硬件信息
  • PSUserTools獲取系統上的用戶,檢查高程和啓動過程管理員
  • PSCodeGen生成PowerShell腳本,C#代碼和P/Invoke
0

我知道我遲到了派對,但@Frode F.提供的答案雖然有效,但技術上不正確。

您可以通過PowerShell訪問計劃任務的Actions集合中的項目,但這不是很明顯。我今天也必須自己弄清楚這一點。

下面的代碼做這一切在PowerShell中,而不必淤泥與周圍的XML:

# I'm assuming that you have a scheduled task object in the variable $task: 
$taskAction = $task.Definition.Actions.Item.Invoke(1) # Collections are 1-based 

這就是全部是獲得一個項目從集合中不使用foreach

由於Actions屬性是包含參數化屬性Item的集合(例如,在C#你會寫myTask.Actions[0]或VB myTask.Actions.Item(1)),PowerShell中表示此Item屬性作爲PSParameterizedProperty對象。要調用與該屬性相關的方法,請使用Invoke方法(用於獲取方法)和InvokeSet方法(用於設置方法)。

我跑快速測試運行OP的代碼和它的工作對我來說(我運行的PowerShell 4.0,但是,也許有什麼用它做):

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0) 

$tasks | select Name, LastRunTime 

foreach ($t in $tasks) 
{ 
    foreach ($a in $t.Actions) 
    { 
     Write-Host "Task Action Path: $($a.Path)" # This worked 
     Write-Host "Task Action Working Dir: $($a.workingDirectory)" # This also worked 
    } 

    $firstAction = $t.Actions.Item.Invoke(1) 
    Write-Host "1st Action Path: $($firstAction.Path)" 
    Write-Host "1st Action Working Dir: $($firstAction.WorkingDirectory)" 
} 

HTH。

相關問題