是否有人使用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
}
}
上面的代码片段在列出任务方面起作用;但是,动作上的循环似乎没有做任何事情,没有错误,没有任何输出。
任何帮助都将不胜感激。
答案 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个模块供您使用。以下是每个模块的简要概述。
答案 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)
使用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