Propriedades de tarefas agendadas no PowerShell?

3

Não sei como fazer isso no PowerShell, mas não acredito que seja compatível.

Por exemplo:

$tasks = schtasks /query 

Armazenará todas as tarefas na variável $tasks

Exemplo de saída:

Folder: \Microsoft\Windows\WindowsBackup
TaskName                                 Next Run Time          Status
======================================== ====================== ===============
ConfigNotification                       Disabled

A propriedade "TaskName" não pode ser referida com facilidade (ou seja, $tasks.TaskName )

Existe alguma outra maneira de se referir à propriedade TaskName na variável $tasks , algo semelhante a como você pode fazer referência a propriedades no cmdlet get-service?

$services = gsv
$services | Where-Object { Write-Output $_.Name }
    
por nulz 31.05.2011 / 10:06

3 respostas

5

Use o parâmetro / fo em schtasks para imprimir a saída como CSV e, em seguida, converta a saída em um objeto Powershell com o ConvertFrom-CSV comando.

$tasks = schtasks /query /fo CSV | ConvertFrom-CSV

Você pode usar a pesquisa por um nome de tarefa específico da seguinte forma

$myTask = $tasks | Where-Object {$_.TaskName -eq "My_Scheduled_Task"}
    
por 02.06.2011 / 19:30
0

Para fazer o que você deseja, você precisará criar um objeto personalizado e preencher o objeto com os detalhes da saída schtasks . Isso lhe dará a capacidade de fazer o que você está procurando. Eu fiz um projeto no trabalho por algum tempo atrás. Eu terei acesso a esse código no domingo e postarei isso em seguida.

Aqui está o Script de consulta da Tarefa Agendada que criei, já que era um dos meus primeiros scripts, não é muito bonito, mas deveria ter todas as informações de que você precisa:

function query_tasks
{
    if ($args -eq '/?')
    {
        Write-Output "Usage: query_tasks ComputerName taskname"
        Write-Output "Task name defaults to wildcard search and can be multiple words."
        Write-Output "Computer name, and task names must be included."
    }
    elseif ($args.length -lt 2)
    {
        Write-Output "Error: Must include computer name and partial task name to search for."
    }
    else
    {
        $CompName = $args[0]
        $Tasks = $args[1..($args.length-1)]
        $arrTasks = $(schtasks /query /v /fo csv /s $CompName)
        $taskName = "'"*$Tasks*'""
        $arrTask = $arrTasks -like $taskName -split '","'

        $arrSchTasksAttributes = @( )

        $arrSchTasksAttributes += "HostName"
        $arrSchTasksAttributes += "TaskName"
        $arrSchTasksAttributes += "NextRunTime"
        $arrSchTasksAttributes += "Status"
        $arrSchTasksAttributes += "LastRunTime"
        $arrSchTasksAttributes += "LastResult"
        $arrSchTasksAttributes += "Creator"
        $arrSchTasksAttributes += "Schedule"
        $arrSchTasksAttributes += "TaskToRun"
        $arrSchTasksAttributes += "StartIn"
        $arrSchTasksAttributes += "Comment"
        $arrSchTasksAttributes += "ScheduledTaskState"
        $arrSchTasksAttributes += "ScheduledType"
        $arrSchTasksAttributes += "StartTime"
        $arrSchTasksAttributes += "StartDate"
        $arrSchTasksAttributes += "EndDate"
        $arrSchTasksAttributes += "Days"
        $arrSchTasksAttributes += "Months"
        $arrSchTasksAttributes += "RunAsUser"
        $arrSchTasksAttributes += "DeleteTaskIfNotRescheduled"
        $arrSchTasksAttributes += "StopTaskIfRunsXHoursandXMins"
        $arrSchTasksAttributes += "Repeat_Every"
        $arrSchTasksAttributes += "Repeat_Until_Time"
        $arrSchTasksAttributes += "Repeat_Until_Duration"
        $arrSchTasksAttributes += "Repeat_StopIfStillRunning"
        $arrSchTasksAttributes += "IdleTime"
        $arrSchTasksAttributes += "PowerManagement"


        $arrTaskObj = $null
        $arrTaskObj = New-Object psobject
        for ($t = 0; $t -lt $arrTask.length; $t++)
        {
            Add-Member -InputObject $arrTaskObj -MemberType NoteProperty '
            -Name $arrSchTasksAttributes[$t] -Value $arrTask[$t]
        }

        $listHeaders = @{Expression={$_.HostName};Label="Host Name"}, @{Expression={$_.TaskName};Label="Task Name"}, @{Expression={$_.NextRunTime};Label="Next Run Time"}, @{Expression={$_.LastRunTime};Label="Last Run Time"}, @{Expression={$_.LastResult};Label="Last Result"}, @{Expression={$_.Status};Label="Current Status"}
        $arrTaskObj | Format-List $listHeaders
    }
}

Essencialmente, ele consulta o servidor durante toda a lista de tarefas agendadas e recebe a saída como uma matriz. Em seguida, procura na saída a linha que contém a tarefa planejada específica. Uma vez encontrado, ele gera uma matriz da linha de dados das tarefas pesquisadas (que não possui informações de cabeçalho neste momento). Em seguida, usando as informações de cabeçalho que a tarefa agendada retorna como uma matriz, ele cria um objeto personalizado com cada informação de cabeçalho como uma propriedade que é então preenchida com os dados da matriz da tarefa específica.

Devido à maneira como o objeto é criado, você provavelmente poderia ajustar esse script para permitir a inclusão de várias tarefas agendadas. Da forma como está, a saída é filtrada através da variável $ listHeaders, mas você pode fazer isso e apenas gerar o objeto $ arrTaskObj para o pipe, o que permitiria chamar e acessar as propriedades para.

    
por 29.06.2011 / 20:41
0

Estou usando o VisualCron , que é uma ferramenta de automação, como o Agendador de tarefas. Tem uma tarefa específica para executar o Powershell. Existem dois modos - inprocess que permitem inserir o código PS no VisualCron e também é possível vincular a um arquivo PS existente.

De qualquer forma, você pode usar o VisualCron embutido em Variáveis para passar informações diretamente para o script do Powershell.

    
por 13.10.2012 / 14:23