如何使用Powershell修改现有的计划任务?


8

我正在研究一些使用Powershell来更新执行各种应用程序的现有计划任务的发布自动化脚本。在我的脚本中,我可以设置应用程序的“路径”和“工作目录”,但似乎没有将更改保存回任务。

function CreateOrUpdateTaskRunner {
    param (
        [Parameter(Mandatory = $TRUE, Position = 1)][string]$PackageName,
        [Parameter(Mandatory = $TRUE, Position = 2)][Version]$Version,
        [Parameter(Mandatory = $TRUE, Position = 3)][string]$ReleaseDirectory
    )

    $taskScheduler = New-Object -ComObject Schedule.Service
    $taskScheduler.Connect("localhost")
    $taskFolder = $taskScheduler.GetFolder('\')

    foreach ($task in $taskFolder.GetTasks(0)) {

        # Check each action to see if it references the current package
        foreach ($action in $task.Definition.Actions) {

            # Ignore actions that do not execute code (e.g. send email, show message)
            if ($action.Type -ne 0) {
                continue
            }

            # Ignore actions that do not execute the specified task runner
            if ($action.WorkingDirectory -NotMatch $application) {
                continue
            }

            # Find the executable
            $path = Join-Path $ReleaseDirectory -ChildPath $application | Join-Path -ChildPath $Version
            $exe = Get-ChildItem $path -Filter "*.exe" | Select -First 1

            # Update the action with the new working directory and executable
            $action.WorkingDirectory = $exe.DirectoryName
            $action.Path = $exe.FullName
        }
    }
}

到目前为止,我一直无法在文档(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx)中找到明显的保存功能。我在这里采用错误的方法,是否需要处理XML任务?


您正在使用哪个版本的Powershell?使用Get-Host找出。
Colyn1337

版本2.0(请参阅serverfault.com/questions/666671/…了解与Verson相关的一些问题!)。如果您的解决方案可以使用Server 2008 R2支持的更高版本的Powershell,那么这将给我额外的“推动”以升级服务器:-)
David Keaveny 2015年

Server 2008R2当前最多支持4.0。请参阅Windows PowerShell要求:technet.microsoft.com/en-us/library/hh847769.aspx
Davidw,2015年

Answers:


2

RegisterTask方法,你会使用更新标志。像这样:

# Update the action with the new working directory and executable
$action.WorkingDirectory = $exe.DirectoryName
$action.Path = $exe.FullName

#Update Task
$taskFolder.RegisterTask($task.Name, $task.Definition, 4, "<username>", "<password>", 1, $null)

有关每个参数的详细信息,请参阅msdn文章。


我真的希望这不是唯一的解决方案,因为如果可以的话,我不想在发布脚本中存储用户名/密码组合...
David Keaveny 2015年

我相信您可以指定本地系统帐户,并保留密码为空。
James Santiago

我的计划任务在专门创建的服务帐户下运行,并且使用Windows身份验证进行数据库访问,因此我仍然需要保留现有凭据。
David Keaveny

只有众所周知的系统帐户才能跳过密码要求,就像您手动更新这些任务一样。使用不知名的帐户时,即使是新的powershell cmdlet都需要用户名和密码。我想您可以在运行时提示输入密码,将其作为安全字符串存储在变量中,然后在需要时访问它,以便仅在运行脚本时将其存储在内存中。
詹姆斯·圣地亚哥
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.