因此,基本上我需要获取与任务调度程序中创建的任务相关联的触发器详细信息。
所以,基本上我想要在这个触发器窗口中设置这些信息,例如每日或每周,重复任务持续时间以及持续时间等。
现在我可以获得以下信息。
Name : LastTaskResult
Value : 0
CimType : UInt32
Flags : Property, ReadOnly, NotModified
IsValueModified : False
Name : NextRunTime
Value : 23-09-2015 11:26:56
CimType : DateTime
Flags : Property, ReadOnly, NotModified
IsValueModified : False
Name : NumberOfMissedRuns
Value : 0
CimType : UInt32
Flags : Property, ReadOnly, NotModified
IsValueModified : False
Name : TaskName
Value : test_Task
CimType : String
Flags : Property, Key, NotModified
IsValueModified : False
Name : TaskPath
Value :
CimType : String
Flags : Property, Key, NotModified, NullValue
IsValueModified : False
所以,基本上我的要求是我有两台服务器。一个是主要的,另一个是备份。我已经在主服务器中安排了任务,并定期将这些任务镜像(robocopy)到备份服务器,该服务器工作正常。
但是当我在操作选项卡中更改触发器详细信息或参数时,它不会出现在备份服务器中,因为我只是检查任务名称是否已经存在于备份服务器中,如果不是正在创建这些任务。
那么有没有办法检查有关触发器的详细信息(每日或每周等,重复详细信息)或操作(脚本和参数详细信息),以便我可以在我的seconadary服务器中相应地更新任务。
答案 0 :(得分:1)
这就是你想要的东西:
$task = Get-ScheduledTask -TaskName "Adobe Flash Player Updater"
$taskTrigger = $task.Triggers[0]
$taskTrigger
它应该给你一个类似于:
的输出Enabled : True
EndBoundary :
ExecutionTimeLimit :
Id :
Repetition : MSFT_TaskRepetitionPattern
StartBoundary : 2000-01-01T09:58:00+09:30
DaysInterval : 1
RandomDelay :
PSComputerName :
编辑:另一种方法,使用ComObject连接
你可以这样做:
$taskService = New-Object -ComObject "Schedule.Service"
$taskService.Connect($env:COMPUTERNAME)
$rootTaskFolder = $taskService.GetFolder("\")
$task = $rootTaskFolder.GetTask("Adobe Flash Player Updater")
$task
这将返回任务的定义。然后,您可以使用Compare-Object
查看备份服务器上是否相同,如果没有,则导出/导入任务。
如果您想解析XML,可以执行以下操作:
$parsedXML = [xml]$task.xml
然后,您可以通过以下操作来比较触发器:
Compare-Object -DifferenceObject $remoteServerParsedXML.GetElementsByTagName("Triggers") -ReferenceObject $parsedXML.GetElementsByTagName("Triggers")
这是否更接近你想要实现的目标?
答案 1 :(得分:0)
我认为你需要的是"基本上" ;)您的任务的导出/导入功能 以下是示例代码:
#connect to scheduler of you master server
$sch = New-Object -ComObject("Schedule.Service")
$sch.connect("$computername")
$root=$sch.GetFolder("\")
$folder =$sch.GetFolder("\subfolder") #if you tasks are defined in a subfolder
#Export all tasks in the subfoder to $path folder in xml format
$folder.getTasks(0) | % {
$path="c:\temp\tasks\$($_.name).xml"
New-Item -ItemType file -Path $path
Set-Content -Path $path -Value $_.xml
}
#connect to scheduler of you backup server
$sch.connect("$backupcomputername")
$folder =$sch.GetFolder("\subfolder")
#import .xml from $task_path
$cred=get-credential # will ask for the credential of the user who run the tasks
Get-childItem -path $task_path -Filter *.xml | %{
$task_name = $_.Name.Replace('.xml', '')
$task_xml = Get-Content $_.FullName
$task = $sch.NewTask($null)
$task.XmlText = $task_xml
$folder.RegisterTaskDefinition($task_name, $task, 6, $cred.UserName, $cred.GetNetworkCredential().password, 1, $null)
}
答案 2 :(得分:0)
您可能会认为这很丑陋,但可以在屏幕上获得所有相关信息。或者,您可以将其保留为可以操作的对象或从那里进行格式化...
$ScheduledTasks = get-scheduledtask | ? {$_.TaskPath -like '*Cool*'}
foreach ($item in $ScheduledTasks) {
[string]$Name = ($item.TaskName)
[string]$Action = ($item.Actions | select -ExpandProperty Execute)
[datetime]$Start = ($item.Triggers | select -ExpandProperty StartBoundary)
[string]$Repetition = ($item.Triggers.Repetition | select -ExpandProperty interval)
[string]$Duration = ($item.triggers.Repetition | select -ExpandProperty duration)
$splat = @{
'Name' = $Name
'Action' = $Action
'Start' = $start
'Repetition' = $Repetition
'Duration' = $Duration
}
$obj = New-Object -TypeName PSObject -property $splat
$obj | Write-Output
}
它将为您提供类似的信息:
Repetition : PT1H
Duration : P1D
Name : MyCoolTask
Action : C:\MyPath\MyCoolTask\MyCoolTask.exe
Start : 1/10/2014 3:00:00 AM
重复是每小时一次(因此PT1H中为1H) 持续时间是最长运行时间(1天) 名称显然是您任务的名称,操作和开始时间也应易于说明。