WinRM远程执行PowerShell脚本:如何启动后无需等待完成?
解决Invoke-Command远程SCCM更新脚本无法后台持续运行的问题
问题根源
你当前的脚本中,远程执行的powershell.exe进程会依附于Invoke-Command创建的临时远程会话。当-AsJob的作业执行完毕(脚本块代码跑完),远程会话会被关闭,连带终止子进程,导致SCCM更新脚本无法继续运行。
解决方案
方案1:用Start-Process启动独立进程
修改远程脚本块,通过Start-Process启动脱离会话的独立PowerShell进程,同时可重定向日志方便排查:
$job = Invoke-Command -ComputerName $hostname -ScriptBlock { # 拼接脚本参数,注意路径转义 $scriptArguments = "-ExecutionPolicy Bypass -File `"$using:localScriptPath`" -InstallApproved" # 启动独立进程,重定向输出到日志文件 Start-Process powershell.exe -ArgumentList $scriptArguments ` -NoNewWindow ` -RedirectStandardOutput "C:\temp\sccm_update_success.log" ` -RedirectStandardError "C:\temp\sccm_update_error.log" } -AsJob -Credential $credentials
这种方式让脚本进程独立于Invoke-Command的会话,即使作业完成、会话关闭,更新脚本仍会在远程服务器后台持续运行。
方案2:通过任务计划执行(更稳定可靠)
如果方案1仍存在会话依赖问题,可借助Windows任务计划服务托管脚本执行,完全脱离PowerShell会话:
$job = Invoke-Command -ComputerName $hostname -ScriptBlock { # 生成唯一任务名避免冲突 $uniqueTaskName = "SCCM_Update_Task_$(Get-Random)" # 创建任务执行动作 $taskAction = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-ExecutionPolicy Bypass -File `"$using:localScriptPath`" -InstallApproved" # 设置5秒后触发的一次性任务 $taskTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddSeconds(5) # 配置任务运行设置:允许电池运行、隐藏窗口 $taskSettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries ` -DontStopIfGoingOnBatteries ` -Hidden # 注册并启动系统级任务(避免权限问题) Register-ScheduledTask -TaskName $uniqueTaskName ` -Action $taskAction ` -Trigger $taskTrigger ` -Settings $taskSettings ` -User "NT AUTHORITY\SYSTEM" | Out-Null Start-ScheduledTask -TaskName $uniqueTaskName # 可选:设置任务执行完成后24小时自动删除 # Update-ScheduledTask -TaskName $uniqueTaskName -Settings (New-ScheduledTaskSettingsSet -DeleteAfter (New-TimeSpan -Hours 24)) } -AsJob -Credential $credentials
任务计划由系统服务托管,完全不受Invoke-Command会话生命周期影响,是长期运行脚本的更可靠选择。
内容的提问来源于stack exchange,提问作者Christopher Luck
相关产品推荐
相关产品推荐

