Свойства запланированных задач в PowerShell?


3

Я не уверен, как это сделать в PowerShell, но я не думаю, что это поддерживается.

Например:

$tasks = schtasks /query 

Будет хранить все задачи в переменной $tasks

Пример вывода:

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

Свойство «TaskName» не может быть указано так просто (т.е. $tasks.TaskName)

Есть ли какой-либо другой способ ссылки на свойство TaskName в $tasksпеременной, например, как вы можете ссылаться на свойства в командлете get-service?

$services = gsv
$services | Where-Object { Write-Output $_.Name }

Как-то связано с Select-String, но я не знаю, как его настроить
nulz

добавил скрипт в мой ответ; надеюсь, что это поможет вам
Matrix Mole

Ответы:


5

Используйте параметр / fo в schtasks, чтобы распечатать вывод как CSV, а затем преобразовать вывод в объект Powershell с помощью команды ConvertFrom-CSV .

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

Затем вы можете использовать поиск для конкретного имени задачи следующим образом

$myTask = $tasks | Where-Object {$_.TaskName -eq "My_Scheduled_Task"}

0

Чтобы сделать то, что вы хотите, вам нужно создать пользовательский объект и заполнить объект данными из schtasksвывода. Это даст вам возможность делать то, что вы ищете. Я сделал проект на работе для этого некоторое время назад. У меня будет доступ к этому коду в воскресенье, и я опубликую его.

Вот сценарий запроса запланированной задачи, который я создал, поскольку он был одним из моих первых сценариев, он не очень красивый, но в нем должна быть вся необходимая информация:

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

По сути, он запрашивает у сервера весь список запланированных задач и получает выходные данные в виде массива. Затем он ищет в выходных данных строку, содержащую определенную запланированную задачу. Как только это найдено, он генерирует массив строки данных для поиска задач (которая не имеет информации заголовка на данный момент). Затем, используя информацию заголовка, которую запланированная задача возвращает в виде массива, он создает пользовательский объект с каждым фрагментом информации заголовка в качестве свойства, которое затем заполняется данными из массива конкретной задачи.

Из-за способа создания объекта вы, вероятно, можете настроить этот сценарий, чтобы включить несколько запланированных задач. В существующем состоянии выходные данные фильтруются через переменную $ listHeaders, но вы можете воспользоваться этим и просто вывести объект $ arrTaskObj в канал, который позволит вам вызывать и получать доступ к свойствам.


0

Я использую VisualCron, который является инструментом автоматизации, как планировщик задач. У него есть конкретная задача для выполнения Powershell. Существует два режима - inprocess, который позволяет вводить PS-код в VisualCron, а также имеется возможность ссылки на существующий PS-файл.

В любом случае вы можете использовать встроенные в переменные VisualCron для передачи информации непосредственно в скрипт Powershell.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.