11

是否有人拥有使用 PowerShell 来清点服务器上的计划任务(包括操作)的链接或脚本?

我能够获取计划服务 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 上的循环似乎没有做任何事情,没有错误,没有任何输出。

任何帮助,将不胜感激。

4

5 回答 5

15

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

从 W7 RK 获取 PowerShellPack,然后尝试 get-scheduledtask

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

摘自 MSDN:

Windows 7 Resource Kit PowerShell Pack 包含 10 个模块,用于使用 PowerShell 完成各种有趣的事情。Import-Module PowerShellPack 实际上导入了 10 个模块供您使用。以下是每个模块的简要概述。

  • WPK从 Windows PowerShell 快速轻松地创建丰富的用户界面。想想 HTA,但很容易。超过 600 个脚本可帮助您构建快速的用户界面
  • TaskScheduler列出计划任务,创建或删除任务
  • 文件系统监控文件和文件夹,检查重复文件,检查磁盘空间
  • IsePack使用超过 35 个快捷方式在集成脚本环境中增强您的脚本编写能力
  • DotNet探索加载的类型,查找可与类型一起使用的命令,并探索如何将 PowerShell、DotNet 和 COM 结合使用
  • PSImageTools转换、旋转、缩放和裁剪图像并获取图像元数据
  • PSRSS利用 PowerShell 的FeedStore
  • PSSystemTools获取操作系统或硬件信息
  • PSUserTools获取系统上的用户,检查提升,并启动-processaadministrator
  • PSCodeGen生成 PowerShell 脚本、C# 代码和 P/Invoke
于 2013-03-15T18:27:01.810 回答
1

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

操作方法:使用 PowerShell 报告计划任务

通过这种方式,您只需要这个单一的脚本,您不需要下载或安装任何其他东西。

账单

于 2013-03-15T19:02:48.043 回答
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 将Item属性表示为一个PSParameterizedProperty对象。要调用与属性关联的方法,请使用Invoke方法(用于 getter)和InvokeSet方法(用于 setter)。

我运行了一个运行 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。

于 2015-06-12T19:53:19.297 回答
1

这里有一个快速的基于:https ://blogs.technet.microsoft.com/heyscriptingguy/2015/01/17/weekend-scripter-use-powershell-to-document-scheduled-tasks/

使用 Powershell:Get-ScheduledTaskGet-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
于 2018-11-02T18:23:27.323 回答