我有一系列计划任务及其各自的运行时间。我想按下次运行顺序对数组进行排序,但无法同时选择任务名称和运行时间以进行输出。
我从远程计算机获取计划的任务和运行时间,如下所示:
$ Array = @(ICM -CN blahcomputernameblah {schtasks.exe / query / fo csv | ConvertFrom-Csv |选择“下一次运行时”,TaskName)
结果是这样的:
下次运行时任务名称 ------------- -------- 6/3/2019 8:00:00 \ Start Banana 6/3/2019 4:00:00 PM \启动Apple 6/5/2019 9:30:00 AM \开始橙色 6/3/2019 10:15:00 PM \停止香蕉 6/3/2019 6:15:00 PM \停止Apple 6/5/2019 11:45:00 AM \停止橙色
下一个要运行的任务将是\ Apple在6/3/2019 4:00:00 PM启动。
所以我想根据下一个运行时间对数组进行排序,然后选择-first 1,但是我只能在没有任务名称的情况下获得下一个运行时间。我将日期和时间字符串转换为DateTime以进行排序操作:
$ Array | %{[DateTime] $ _。“下一次运行时间”}} |排序选择-First 1
但是我不知道如何将TaskName添加到输出中
请帮忙吗?
答案 0 :(得分:1)
由于schtasks.exe的输出已本地化,我建议直接使用等效的PowerShell cmdlet避免直接进行[datetime]转换。
Get-ScheduledTask |
Get-ScheduledTaskInfo |
Where-Object NextRunTime |
Sort-Object NextRunTime |
Select-Object TaskName,NextRunTime -First 1
答案 1 :(得分:0)
您可以像这样在您的选择中创建一个属性:
schtasks.exe /query /fo csv | ConvertFrom-Csv | select @{N="DateRunTime";E={[DateTime]$_."Next Run Time"}}, TaskName | sort DateRunTime | select -First 1
答案 2 :(得分:0)
尝试在Task Scheduler脚本对象及其API的帮助下完成所需的工作。可以从Task Scheduler Reference获得完整的信息。以下脚本演示了如何执行此操作。
$schedsvc = New-Object -ComObject Schedule.Service
$schedsvc.Connect()
$fq = New-Object System.Collections.Queue
$fq.Enqueue($schedsvc.GetFolder('\'))
$tc = while ( $fq.Count -gt 0 ) {
$f = $fq.Dequeue()
$f.GetFolders(0) | ForEach-Object { $fq.Enqueue($_) }
$f.GetTasks(0) | Select-Object Name, NextRunTime
}
$tc | Where-Object { $_.NextRunTime -gt (Get-Date)} |
Sort-Object -Property NextRunTime | Select-Object -First 1 |
Format-Table -AutoSize
输出:
Name NextRunTime
---- -----------
Opera scheduled Autoupdate 1542563984 02.06.2019 22:17:10