Como posso modificar uma tarefa agendada existente usando o Powershell?

8

Estou trabalhando em alguns scripts de automação de versão que usam o Powershell para atualizar tarefas agendadas existentes que executam vários aplicativos. No meu script, posso definir o caminho e o diretório de trabalho do aplicativo, mas não parece salvar as alterações de volta à tarefa.

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

Até agora, não consegui encontrar uma função Salvar óbvia na documentação ( link ). Estou tomando a abordagem errada aqui e preciso mexer com a tarefa XML?

    
por David Keaveny 11.02.2015 / 03:15

1 resposta

2

O método RegisterTask tem um sinalizador de atualização que você usaria. Algo parecido com isto:

# 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)

Veja o artigo do msdn para detalhes de cada parâmetro.

    
por 18.02.2015 / 05:45