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 }

3 ответа3

5

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

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

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

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

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

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

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 в канал, который позволит вам вызывать и получать доступ к свойствам.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .