如何在Win10中通过任务计划程序让PowerShell脚本持续运行
故障排查与解决步骤
任务计划手动运行正常、自动触发返回0x1退出码,本质是自动运行的上下文和手动交互式运行的上下文参数不匹配导致的启动失败,按以下步骤修正即可:
1. 修正任务计划基础配置
- 「常规」选项卡:勾选「不管用户是否登录都要运行」,不要勾选「不存储密码」;如果脚本需要访问受限目录/资源,额外勾选「使用最高权限运行」,适配系统选择「Windows 10」
- 「操作」选项卡:启动程序不要直接选ps1脚本,程序或脚本填写
powershell.exe,添加参数填写-ExecutionPolicy Bypass -NoProfile -File "D:\VirtualBox-Powershell\你的脚本名称.ps1",「起始于」填写脚本所在的目录D:\VirtualBox-Powershell\,大部分0x1报错都是漏填起始于路径导致的路径识别错误 - 「触发器」选项卡:登录触发器选择你自动登录的特定用户;如果需要做保活,重复触发间隔设为你需要的校验时长,规则选择「如果任务已运行,请勿启动新实例」
- 「设置」选项卡:取消勾选「如果任务运行超过指定时长停止任务」、「任务不再运行时主动终止」,勾选「任务失败后自动重启」,重启次数设为3次,间隔1分钟
2. 脚本添加错误日志定位问题
如果修改配置后仍报错,在脚本开头添加日志记录代码,把运行时的所有错误输出到本地文件:
$errorLog = "D:\VirtualBox-Powershell\run_error.log" Start-Transcript -Path $errorLog -Append
所有启动、运行阶段的报错都会被记录到日志文件,可直接定位是权限、路径缺失还是依赖缺失的问题。
3. 无限循环脚本优化
为了避免单次业务逻辑报错直接终止整个进程,把你的无限循环逻辑包裹异常捕获:
while ($true) { try { # 替换为你实际的业务逻辑 Add-Content -Path $f -Value $((Get-Date).ToString()) Start-Sleep -Seconds 1 } catch { # 报错写入日志后继续运行,不退出进程 $_ | Out-File $errorLog -Append Start-Sleep -Seconds 10 } }
4. 额外保活方案
如果脚本仍偶发被系统终止,可以额外配置一个轻量监控脚本,每分钟检查主脚本进程是否存在,不存在就自动拉起:
$mainScriptName = "你的主脚本文件名.ps1" $runningProc = Get-Process powershell -ErrorAction SilentlyContinue | Where-Object { $_.CommandLine -match $mainScriptName } if (-not $runningProc) { Start-Process powershell.exe -ArgumentList "-ExecutionPolicy Bypass -NoProfile -File `"D:\VirtualBox-Powershell\$mainScriptName`"" -WindowStyle Hidden }
给该监控脚本单独配置每分钟触发的任务计划即可。
内容的提问来源于stack exchange,提问作者WhiskerBiscuit
相关产品推荐
相关产品推荐

