在 Windows 2012 R2 中使用 Powershell 导入计划任务

Importing Scheduled Tasks with Powershell in Windows 2012 R2

我是 Powershell 脚本编写的新手,但我试图修改我发现 here 的脚本,以使用 Windows 2012 R2 中的 Powershell 导入一些 XML 计划任务。

我已使用此脚本成功将计划任务导入根 [Task Scheduler Library]。

问题似乎是需要将计划任务导入到任务计划程序库下的子文件夹中,比方说"SubTasks"

$task_path = "C:\Users\me\Desktop\ST Testing\exported ST's\scheduledTask.xml"
$task_user = "usr"
$task_pass = "pwd"

$schedule = new-object -com("Schedule.Service")
$schedule.Connect("server") # servername
#$folder = $schedule.GetFolder("\") <===This works fine
$folder = $schedule.GetFolder("\SubTasks") #<===This does not work
Write-Host $folder

Get-Item $task_path | % {
   $task_name = $_.Name.Replace('.xml', '')
   $task_xml = Get-Content $_.FullName
   $task = $schedule.NewTask($null)
   $task.XmlText = $task_xml
   $folder.RegisterTaskDefinition($task_name, $task, 6, $task_user, $task_pass, 1, $null)

}

当我 运行 上述 Powershell 脚本时,我收到此错误:

Exception calling "RegisterTaskDefinition" with "7" argument(s): "The specified path is invalid. (Exception from HRESULT: 0x800700A1)" At C:\Users\me\Desktop\ST Testing\ImportSTs.ps1:22 char:5 + $folder.RegisterTaskDefinition($task_name, $task, 6, $task_user, $task_pass, ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation

提前致谢。

如果您使用的是 powershell 3(win2k12 - 所以您是)及更高版本,则有一整套任务调度模块。

参见:gcm -Module PSScheduledJob

然而,它似乎没有提供从 xml.

导入任务的简单方法

有相应的模块,this particular module 反序列化 xml 文件并测试所有设置,似乎比下面列出的 schtasks 解决方案更麻烦。

对于 powershell 2 (win2k8) 我发现它更容易使用 schtasks - 完整参考在这里:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx

例如(从 xml 文件安排任务,该任务将 运行 在特定用户信用下:

schtasks /Create /XML $xmlfile /RU $creds.UserName /RP $creds.GetNetworkCredential().Password /TN "My Task Name"

我通过手动创建任务并导出到 xml 获得了我的 xml 文件(我从 xml 中删除了凭据和信息节点)

能够满足我们的需求。

$task_user="username"
$task_pass="password"
$schedule=new-object -ComObject ("Schedule.Service")
$schedule.Connect("server")
$folder=$schedule.GetFolder("\tasks")
$path="\server\c$\temp\Tasks\"
Get-ChildItem $path -Filter "*.xml"| foreach {
$task_conf=Get-Item -Path $_.FullName
$taskname=$task_conf.Name
$task_xml=$task_conf.FullName
$task=$schedule.NewTask(0)
$task.XmlText=(Get-Content $task_xml).Replace('Task version="1.1" xmlns','Task version="1.2" xmlns')
$folder.RegisterTaskDefinition($taskname,$task,6,$task_user,$task_pass,1,$null)
} 

Register-ScheduledTask支持使用XML定义任务:

Register-ScheduledTask `
    -User $task_user `
    -Password $task_pass `
    -TaskName ([IO.Path]::GetFileNameWithoutExtension($task_path)) `
    -TaskPath '\SubTasks' `
    -Xml (Get-Content $task_path -Raw)

请注意,您需要获取实际的 XML 内容-Raw 标志阻止 Get-Content 返回 String[],这也使 Register-ScheduledTask 不高兴。

另请注意 Register-ScheduledTask 有一个 -TaskPath 参数,允许您根据需要指定一个子文件夹来放置任务。

我不喜欢使用坟墓标记来续行,所以我更喜欢使用 splatting 将内容分散到多行中:

$taskArgs = @{
    User='usr';
    Password='pwd';
    TaskName=([IO.Path]::GetFileNameWithoutExtension($task_path));
    TaskPath='\SubTasks';
    Xml=(Get-Content $task_path -Raw)
}

Register-ScheduledTask @taskArgs