【问题标题】:Importing Scheduled Tasks with Powershell in Windows 2012 R2在 Windows 2012 R2 中使用 Powershell 导入计划任务
【发布时间】:2015-07-10 18:25:28
【问题描述】:

我对 Powershell 脚本非常陌生,但我尝试修改我找到的 here 脚本以在 Windows 2012 R2 中使用 Powershell 导入一些 XML 计划任务。

我已成功使用此脚本将计划任务导入根 [任务计划程序库]。

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

$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 脚本时,我收到了这个错误:

使用“7”参数调用“RegisterTaskDefinition”的异常:“The 指定的路径无效。 (来自 HRESULT 的异常:0x800700A1)” 在 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

提前致谢。

【问题讨论】:

标签: windows powershell scheduled-tasks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您使用的是 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

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

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

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

    【讨论】:

      【解决方案3】:

      能够让它满足我们的需求。

      $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)
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-14
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 2014-12-28
        • 2016-03-08
        相关资源
        最近更新 更多