如何使用PowerShell清点计划任务

时间:2013-03-15 18:21:47

标签: powershell scheduled-tasks

是否有人使用PowerShell来清点服务器上的计划任务,包括操作?

我能够获得Scheduled Service com对象和我称之为“顶级”属性(name,state,lastruntime),但是也希望从Schedule Tasks的“Actions”部分获取信息(基本上) ,Scheduled Task及其命令行的名称。)

例如:

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

上面的代码片段在列出任务方面起作用;但是,动作上的循环似乎没有做任何事情,没有错误,没有任何输出。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:13)

这可能与目前的答案非常相似,但我写了一个快速的脚本来帮助你。当前脚本的问题是任务中没有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

实施例。输出

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

答案 1 :(得分:1)

从W7 RK获取PowerShellPack,并尝试get-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

答案 2 :(得分:1)

另一种方法是我写的一个名为Get-ScheduledTask.ps1的脚本,可以在本文中找到:

How-To: Use PowerShell to Report on Scheduled Tasks

通过这种方式,您只需要这个单一脚本,而无需下载或安装任何其他内容。

比尔

答案 3 :(得分:1)

我知道我迟到了,但@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表示{ {1}}属性作为Item对象。要调用与属性关联的方法,可以使用PSParameterizedProperty方法(对于getter)和Invoke方法(对于setter)。

我运行了一个运行OP代码的快速测试,它对我有用(但我正在运行PowerShell 4.0,所以也许这与它有关):

InvokeSet

HTH。

答案 4 :(得分:0)

这里是基于https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/17/weekend-scripter-use-powershell-to-document-scheduled-tasks/

的快速参考

使用Powershell: Get-ScheduledTask Get-ScheduledTaskInfo

### run like >>  Invoke-Command -ComputerName localhost, server1, server2 -FilePath C:\tmp\Get_WinTasks.ps1

$taskPath = "\"
$outcsv = "c:\$env:COMPUTERNAME-WinSchTaskDef.csv"
Get-ScheduledTask -TaskPath $taskPath |
    ForEach-Object { [pscustomobject]@{
     Server = $env:COMPUTERNAME
     Name = $_.TaskName
     Path = $_.TaskPath
     Description = $_.Description
     Author = $_.Author
     RunAsUser = $_.Principal.userid
    LastRunTime = $(($_ | Get-ScheduledTaskInfo).LastRunTime)
     LastResult = $(($_ | Get-ScheduledTaskInfo).LastTaskResult)
     NextRun = $(($_ | Get-ScheduledTaskInfo).NextRunTime)
     Status = $_.State
     Command = $_.Actions.execute
     Arguments = $_.Actions.Arguments }} |
     Export-Csv -Path $outcsv -NoTypeInformation