如何修改PowerShell脚本实现每月指定日期执行计划任务?
问题:如何调整PowerShell脚本,让计划任务每月1日触发执行?
我想创建一个每月1日启动的月度计划任务。现在的脚本能运行,但只能创建每4周在指定日期执行的任务。我需要任务在固定日期执行,这样服务器停机告警时,能明确是这个计划任务导致的。
当前脚本代码:
# 目前PS v5.1无法直接设置“每月1日”这类计划。 # 以下是最接近月度计划的实现,但严格基于周数间隔。 $ErrorActionPreference = "SilentlyContinue" $ScheduledTaskActions = @{ Execute = "powershell.exe" Argument = "Restart-Computer -Force" } $TaskAction = New-ScheduledTaskAction @ScheduledTaskActions $ScheduledTaskParameters = @{ TaskName = "Restart Computer - Monthly" Trigger = New-ScheduledTaskTrigger -At "00:00" -Weekly -WeeksInterval "4" -DaysOfWeek "Monday" Action = $TaskAction User = "NT Authority\System" Runlevel = "Highest" Description = "Reboots the machine every four weeks." } Register-ScheduledTask @ScheduledTaskParameters
上述代码生成的触发器是每4周周一00:00执行,但我需要的是每月1日执行的触发器。
我曾尝试用$trigger = $triggers.Create(4)创建月度触发器,但查完微软文档还是不知道该代码的正确插入位置,而且这也不是标准PowerShell语法。我找到了相关参考链接,但没完全理解实现方式,也没找到完整示例。
更新后的脚本
在MisterSmith的帮助下,我测试了以下脚本,效果符合预期。我曾修改日期条件$Date.Day -le "27"和星期条件$Date.DayOfWeek -eq "Wednesday",手动触发任务后服务器成功重启,之后我恢复设置,将任务改为每月第一个周一执行。
$ErrorActionPreference = "SilentlyContinue" # 执行核心操作的命令 $Command = { $Date = Get-Date if(($Date.Day -le "7") -and ($Date.DayOfWeek -eq "Monday")){ Restart-Computer -Force } } # 将命令块转换为Base64编码,便于添加到计划任务 $Base64Command = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($Command)) ## 创建计划任务 # 任务命令与参数的哈希表,参数为上述Base64编码命令 $ScheduledTaskActions = @{ Execute = "powershell.exe" Argument = "-EncodedCommand $Base64Command" } # 任务操作变量 $TaskAction = New-ScheduledTaskAction @ScheduledTaskActions # Register-ScheduledTask使用的参数哈希表 $ScheduledTaskParameters = @{ TaskName = "Restart Computer - First Monday of Every Month" Trigger = New-ScheduledTaskTrigger -At "00:30" -Weekly -DaysOfWeek "Monday" Action = $TaskAction User = "NT Authority\System" Runlevel = "Highest" Description = "Reboots the machine on the first Monday of every month." } # 注册新计划任务 Register-ScheduledTask @ScheduledTaskParameters -Force
该脚本在Windows任务计划程序中的显示效果:
- 触发器:每周一00:30执行
- 触发器详情:每周触发一次,执行时间为周一00:30
- 操作:运行powershell.exe并执行Base64编码的命令块
内容的提问来源于stack exchange,提问作者RKillcrazy
相关产品推荐
相关产品推荐

