В настоящее время я пытаюсь создать сценарий 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 он показывает все правильно.
$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 30) -DeleteExpiredTaskAfter (New-TimeSpan -Seconds 0)
Но я думаю, что 0 просто будет нулевым, поэтому хотелось бы не использовать этот параметр. - person BenH   schedule 16.03.2017