在 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
我是 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