Задача New-ScheduledTaskSettingsSet с истекающим сроком действия

В настоящее время я пытаюсь создать сценарий Powershell, общей целью которого будет создание запланированной задачи на моей виртуальной машине, которая будет перезагружать удаленные компьютеры в определенное время. Проблема, с которой я сейчас сталкиваюсь, заключается в том, чтобы установить срок действия задачи и удалить ее после ее завершения.

Одна путаница заключается в том, что, похоже, существует несоответствие между типом переменной, которую хочет командлет, и тем, как существующая переменная отображается в системе. Итак, в качестве примера у меня есть фиктивная задача, которая: - Запускается один раз в 23:00 16.03.2017 и истекает в 23:30 16.03.2017 на вкладке «Триггеры» - Имеет параметр «Если задача не планируется запустить снова, удалите его после: «Немедленно» в настройках.

Если я посмотрю на существующую задачу с помощью Get-ScheduledTask, то значения будут выглядеть следующим образом: (Get -ScheduledTask -TaskName Test).Настройки

Если я делаю Get-Member, эти значения представляют собой строки (Get-ScheduledTask -TaskName Test).Settings | Get-Member

Теперь часть моей проблемы может быть полностью связана с тем, что я использую неправильные командлеты для этого (только вчера начал возиться с этим). Основной сценарий, который я использую при тестировании:

    function Create-Task ($Computer,$Time)
{
    $Task = New-ScheduledTaskAction -Execute 'cmd.exe'`
    -Argument "/c `"Shutdown /m \\$Computer /r /t 0`""
    $Trigger = New-ScheduledTaskTrigger -Once -At $Time 
    $Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit 'PT72H' -DeleteExpiredTaskAfter 'PT0S'
    Register-ScheduledTask -Action $Task -Trigger $Trigger -TaskName "Test" -Description "Testing this out" -Settings $Settings

}

$Comp = "WIN7-0031B"
[datetime]$TriggerTime = '3/16/2017 11:00PM'
Create-Task -Computer $Comp -Time $TriggerTime

Когда я смотрю Get-Member для командлета New-ScheduledTaskSettingsSet, он снова говорит, что эти значения являются строками.

Однако, если я попытаюсь запустить скрипт как есть, он жалуется на то, что они не являются переменными даты и времени:

"New-ScheduledTaskSettingsSet: не удается обработать преобразование аргумента для параметра ExecutionTimeLimit". Невозможно преобразовать значение "PT72H" в тип "System.TimeSpan". Ошибка: "Строка не была распознана как допустимый TimeSpan." (я бы опубликовал скриншот, но я только что присоединился к StackOverflow, поэтому у меня нет репутации).

До сих пор я пытался изменить переменную $Settings на такие вещи, как:

$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 30).Minutes -DeleteExpiredTaskAfter (New-TimeSpan -Seconds 0).Seconds

а также

$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 30).Minutes.ToString() -DeleteExpiredTaskAfter (New-TimeSpan -Seconds 0).Seconds.ToString()

В обоих сценариях он не генерирует никаких сообщений об ошибках, но настройка просто не создается. Мне интересно, требуется ли для чего-то подобного создание задачи без настройки, а затем выполнение чего-то вроде

Get-ScheduledTask -TaskName 'Test' | Set-ScheduledTask <Some other code here>

тип метода, но не был на 100% уверен в том, как это сделать. Я новичок в powershell и совершенно новичок в создании запланированных задач через Powershell, и любая помощь будет очень признательна! Версия Powershell — версия 5.

Редактировать комментарий: похоже, когда я вставил свой скрипт в StackOverflow, он показывает, что большая часть его находится в кавычках, и я не знаю, почему, но в моем ISE он показывает все правильно.


person T. Staben    schedule 16.03.2017    source источник
comment
$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 30) -DeleteExpiredTaskAfter (New-TimeSpan -Seconds 0) Но я думаю, что 0 просто будет нулевым, поэтому хотелось бы не использовать этот параметр.   -  person BenH    schedule 16.03.2017


Ответы (1)


В конце концов удалось заставить это работать. Я нашел дополнительный пост StackOverflow и статью, которая помогла мне двигаться в правильном направлении:

Powershell v4. Создать задачу удаленного планировщика задач с истекающим сроком действия и удалить

https://blogs.technet.microsoft.com/platformspfe/2015/10/26/configuring-advanced-scheduled-task-parameters-using-powershell/

Рабочий сценарий (по крайней мере, в том, что касается работы этого конкретного аспекта):

function Create-Task ($Computer,$Time)
{

    $ActionArgs = "/c `"Shutdown /m \\$Computer /r /t 0`""
    $TaskAction = New-ScheduledTaskAction -Execute 'cmd.exe' -Argument $ActionArgs 
    $TaskUserName = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount
    $TaskSettings = New-ScheduledTaskSettingsSet -Compatibility V1 -ExecutionTimeLimit (New-TimeSpan -Minutes 30) -DeleteExpiredTaskAfter (New-TimeSpan -Seconds 0)
    $TaskTrigger = New-ScheduledTaskTrigger -Once -At $Time
    $Task = New-ScheduledTask -Action $TaskAction -Trigger $TaskTrigger -Principal $TaskUserName -Settings $TaskSettings

    Register-ScheduledTask -TaskName "Test" -InputObject $Task -Force

    $RegisteredTask = Get-ScheduledTask -TaskName "Test"
    $RegisteredTask.Triggers[0].EndBoundary = $Time.AddMinutes(30).ToString('s')
    $RegisteredTask.Settings.DeleteExpiredTaskAfter = 'PT0S'
    $RegisteredTask | Set-ScheduledTask -User "NT AUTHORITY\SYSTEM"


}

$Comp = "WIN7-0031B"
[datetime]$TriggerTime = '3/17/2017 11:00PM'
Create-Task -Computer $Comp -Time $TriggerTime

Я также заметил, что с самого начала делал неправильно: я путал ExecutionTimeLimit со свойством EndBoundary.

Также для справки: если вы попытаетесь запустить это в ISE, не запуская ISE в качестве администратора, вы, скорее всего, получите проблему с отказом в доступе. Я планирую в основном использовать этот скрипт как запланированную задачу, которая ищет CSV-файл для создания других задач и будет запускать его как систему, поэтому это не должно быть проблемой. Но на всякий случай, если кто-то зайдет в эту ветку и столкнется с проблемой

person T. Staben    schedule 17.03.2017