因此,基本上,我需要获取与在任务计划程序中创建的任务相关联的触发器详细信息。
因此,基本上,我希望将这些信息设置在该触发窗口中,例如每天或每周,并重复任务持续时间以及持续时间等。
现在可以获取以下信息。
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
所以,基本上我的要求是我有两台服务器。一种是主要的,另一种是备用的。我已将任务安排在主服务器中,并定期将这些任务镜像(自动复制)到备份服务器,这绝对可以正常工作。
但是当我在操作选项卡中更改触发器详细信息或参数时,它不会出现在备份服务器中,因为我只是在检查任务名称是否已经存在或是否在备份服务器中,如果没有创建这些任务。
因此,有任何方法可以检查有关触发器的详细信息(每天或每周等,重复详细信息)或操作(脚本和参数详细信息),以便我可以在辅助服务器中相应地更新任务。
您想要的是这样的东西:
$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")
这是否更接近您想要达到的目标?
我认为您需要的是“基本上”;)您的任务的导出/导入功能。这是一个示例代码:
#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)
}
您可能会认为这很丑陋,但可以在屏幕上获得所有相关信息。或者,您可以将其保留为可操作的对象或从那里进行格式化...
$ScheduledTasks = get-scheduledtask | ? {$_.TaskPath -like '*Cool*'}
foreach ($item in $ScheduledTasks) {
[string]$Name = ($item.TaskName)
[string]$Action = ($item.Actions | select -ExpandProperty Execute)
[string]$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 : 2014-01-08T17:00:00
重复是每小时一次(因此PT1H中为1H)持续时间是最长运行时间(1天)名称显然是您的任务名称,操作和开始时间也应易于说明。