New-ScheduledTaskSettingsSet过期任务

时间:2017-03-16 17:39:42

标签: powershell taskscheduler

我目前正在尝试创建一个Powershell脚本,整体目标将在我的VM上创建一个计划任务,该任务将在特定时间重启远程计算机。我目前遇到的问题是尝试将任务设置为过期,并在完成后删除。

有一点令人困惑的是,cmdlet想要的变量类型与系统中现有的变量类型之间似乎存在差异。举个例子,我有一个虚拟任务: - 在2017年3月16日下午11:00返回一次,并在触发器选项卡中于2017年3月16日晚上11:30到期 - 如果设置“如果任务未安排再次运行,请在设置之后立即删除”。

如果我使用Get-ScheduledTask查看现有任务,则会出现以下值: (Get-ScheduledTask -TaskName Test).Settings

如果我执行Get-Member,这些值就是字符串 (Get-ScheduledTask -TaskName Test).Settings | Get-Member

现在我的问题的一部分可能完全是因为我使用了错误的cmdlet来解决这个问题(昨天刚开始搞乱这个)。我在测试时使用的基本脚本是:

    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

当我查看New-ScheduledTaskSettingsSet cmdlet的Get-Member时,它再次说这些值是字符串

但是,如果我尝试按原样运行脚本,则会抱怨它们不是日期时间变量:

“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中它显示正确的内容。

1 个答案:

答案 0 :(得分:0)

最终能够让这个工作。我发现了一个额外的StackOverflow帖子和一篇帮助我找到正确方向的文章:

Powershell v4. Create remote task scheduler task set to expire and delete

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文件以创建其他任务,并将其作为系统运行,因此不应该成为问题。但是万一有人在这个帖子中遇到问题并遇到问题