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

在Windows 2012 R2中使用Powershell导入计划任务,windows,powershell,scheduled-tasks,Windows,Powershell,Scheduled Tasks,我对Powershell脚本非常陌生,但尝试修改了一个脚本,我发现该脚本用于在Windows 2012 R2中使用Powershell导入一些XML计划任务 我已成功地使用此脚本将计划任务导入根[Task Scheduler Library] 问题似乎是调度任务需要导入到任务调度程序库下的子文件夹中,比如说“子任务” $task\u path=“C:\Users\me\Desktop\ST Testing\exported ST's\scheduledTask.xml” $task\u user

我对Powershell脚本非常陌生,但尝试修改了一个脚本,我发现该脚本用于在Windows 2012 R2中使用Powershell导入一些XML计划任务

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

问题似乎是调度任务需要导入到任务调度程序库下的子文件夹中,比如说“子任务”

$task\u path=“C:\Users\me\Desktop\ST Testing\exported ST's\scheduledTask.xml”
$task\u user=“usr”
$task\u pass=“pwd”
$schedule=新对象-com(“schedule.Service”)
$schedule.Connect(“服务器”)#服务器名
#$folder=$schedule.GetFolder(“\”)如果您使用的是powershell 3(win2k12-您也是)及以上版本,则有一个完整的任务调度模块

请参阅:
gcm-模块PSScheduledJob

但是,从xml导入任务似乎不是一种简单的方法

其中有一些模块,反序列化xml文件并测试所有设置,似乎比下面列出的解决方案更麻烦

对于powershell 2(win2k8),我发现更容易使用
schtasks
-full ref here:

例如(从xmlfile调度任务,任务将在特定的用户凭据下运行:

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)
} 
支持使用XML定义任务:

注册ScheduledTask`
-用户$task\u用户`
-密码$task\u pass`
-TaskName([IO.Path]::GetFileName withoutextension($task\u Path))`
-任务路径“\subtask”`
-Xml(获取内容$task_路径-原始)
请注意,您需要获取实际的XML内容。
-Raw
标志防止
获取内容
返回
字符串[]
,这也会使
注册ScheduledTask
不满意

还请注意,
Register ScheduledTask
有一个
-TaskPath
参数,允许您指定一个子文件夹,以便在需要时将任务放入其中

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

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

Register-ScheduledTask @taskArgs

路径是否存在?类似的要求,也必须支持ps v2,因此我选择使用
schtasks
-我的解决方案:是的,如果您的意思是子任务[\subtask]文件夹是否存在。它已在任务计划程序中创建。感谢您的回复。
$taskArgs = @{
    User='usr';
    Password='pwd';
    TaskName=([IO.Path]::GetFileNameWithoutExtension($task_path));
    TaskPath='\SubTasks';
    Xml=(Get-Content $task_path -Raw)
}

Register-ScheduledTask @taskArgs