在Windows Server 2016中无需任务计划程序,实现PowerShell 7.1.5脚本脱离会话持续后台运行的方法
在Windows Server 2016上让PowerShell 7脚本脱离会话持续运行的方案
先帮你理清几个关键疑问,再给你不用任务计划的可行方法:
关于Linux的nohup &
你猜的没错,Linux的nohup和&不只是隐藏窗口:
&是把进程放到后台运行,不占用当前终端输入nohup是让进程忽略终端关闭时发送的SIGHUP信号,即使注销系统,进程依然会持续运行,这才是核心的“脱离会话”效果。
为什么你之前的方法没用?
你试的start-job、.\test.ps1 &这些都是PowerShell会话内的作业/后台执行,它们本质上是依附于当前PowerShell会话的。当你关闭CMD/PowerShell窗口、注销系统时,整个会话会被终止,里面的所有作业也会跟着停止,所以达不到你要的效果。
不用任务计划的替代方案
方案1:用Start-Process创建独立进程
这是最简单的原生方法,不需要额外工具。它会创建一个完全独立于当前会话的pwsh进程,关闭窗口或注销后依然运行:
Start-Process -FilePath "pwsh.exe" -ArgumentList "-File C:\temp\test.ps1" -NoNewWindow -WindowStyle Hidden -PassThru
-PassThru会返回进程对象,你可以直接看到进程ID,方便后续管理- 查看运行状态:
Get-Process pwsh,找到对应脚本的进程 - 停止进程:
Stop-Process -Id <进程ID>
⚠️ 注意:你脚本里用的Write-Host在后台进程里不会有任何输出,因为没有终端窗口接收。如果需要记录输出,建议修改脚本把内容写入日志:
foreach($n in (0..100)) { "Hello World $n" | Add-Content -Path C:\temp\test.log -Append Start-Sleep -Seconds 2 }
方案2:用Sysinternals的psexec工具
如果你需要更高权限(比如系统账户)运行脚本,可以用psexec:
psexec -s -d pwsh.exe -File C:\temp\test.ps1
-s:以系统账户运行,权限更高,适合需要访问系统级资源的脚本-d:不等待脚本执行完成,直接返回,让脚本在后台独立运行- 注意:需要先下载psexec(属于Sysinternals Suite),放到系统PATH目录或者指定完整路径使用。
关于任务计划的疑问
你担心任务计划每分钟检查占用资源?其实完全没必要:
- 任务计划的“每分钟检查”只是一个触发条件,当设置了“如果任务已在运行则不启动新实例”后,只有当脚本没在运行时才会执行,资源消耗几乎可以忽略。
- 而且任务计划是官方推荐的最稳定的后台运行方式,可以设置失败重试、日志记录、运行权限等,其实是长期运行脚本的最优解。
核心问题解答:任务计划是唯一方式吗?
不是。上面的Start-Process和psexec都能实现脱离会话持续运行的效果,但任务计划是最可控、最易管理的方式。如果实在不想用,优先选择Start-Process的原生方案。
内容的提问来源于stack exchange,提问作者learntofix
相关产品推荐
相关产品推荐

