修改任务计划程序条目任务参数时无法获取旧参数的问题
问题根源分析
你的代码核心问题在于:
$_.Actions返回的是任务动作对象集合,直接将其拼接进字符串时,PowerShell会输出对象的类型名MSFT_TaskExecAction,而非实际的命令参数- 直接覆盖
$actions变量会丢失原任务的多动作条目,最终只剩一个错误的动作
修正后的代码
$PREFIX = "-window minimized" $taskPath = "\somepath\" Get-ScheduledTask -CimSession "servername" -TaskPath $taskPath -TaskName "mytask" | ForEach-Object { $updatedActions = @() # 遍历任务的每一个动作,保留多步骤任务的所有条目 foreach ($action in $_.Actions) { if ($action.Execute -eq "powershell") { # 原动作是PowerShell时,直接给参数添加最小化前缀 $newArgument = "$PREFIX $($action.Argument)" $updatedAction = New-ScheduledTaskAction -Execute $action.Execute -Argument $newArgument } else { # 非PowerShell动作,用cmd的start /min命令实现最小化启动 $newArgument = "/min $($action.Execute) $($action.Argument)" $updatedAction = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c start $newArgument" } $updatedActions += $updatedAction } # 用更新后的动作集合覆盖原任务 Set-ScheduledTask -CimSession "servername" -InputObject $_ -Action $updatedActions }
关键优化点
- 保留多动作任务:通过遍历每个动作并重新构建动作集合,避免丢失原任务的多步骤配置
- 提取实际参数:用
$action.Argument获取原动作的真实命令参数,而非直接拼接对象 - 分场景处理:针对PowerShell和非PowerShell程序分别采用对应最小化方案,适配不同任务类型
- 简化任务定位:使用
-InputObject $_直接传入原任务对象,无需重复指定TaskPath和TaskName
额外注意事项
- 如果原PowerShell参数已包含
-window相关配置,建议先判断并替换,避免重复参数冲突 - 测试阶段可注释掉
Set-ScheduledTask,改用Write-Output $updatedActions预览修改后的动作内容 - 确保执行脚本的账号拥有远程服务器计划任务的修改权限
内容的提问来源于stack exchange,提问作者Stack Packet
相关产品推荐
相关产品推荐

