会话复用是什么
New-PSSession 建立一条持久化的远程 PowerShell 会话,之后用 Invoke-Command -Session 在同一条连接上反复执行命令。相比每次调用都写 -ComputerName,复用会话省掉了重复的身份验证与 WinRM 握手,批量巡检时差别很明显;会话还保留了变量,适合“先取数据、再在远端基于数据计算”的两步式操作。用完记得 Remove-PSSession 释放。
基本信息
| 适用平台 | PowerShell 5.1 / 7.x;基于 WinRM(或 SSH 传输) |
|---|---|
| 创建语法 | New-PSSession -ComputerName x[,y] |
| 执行语法 | Invoke-Command -Session $s { ... } |
| 管理命令 | Get-PSSession、Remove-PSSession、Disconnect-PSSession、Connect-PSSession |
| 断开与移除 | 断开保留远端会话状态,移除则彻底结束 |
| 断开超时 | 默认断开后保留一定时间(IdleTimeout),超时远端会话被回收 |
典型使用场景
- 批量巡检:一次建会话,对多台机器执行同一段脚本
- 采集与处理分离:远端先收集数据,再在本地汇总统计
- 长流程操作:避免每步都重新认证,缩短整体耗时
- 临时断线续做:断开后稍后重连同一会话继续执行
- 跨网段时配合 SSH 传输建立会话,绕开 WinRM 的限制
常用示例
常用示例
$s = New-PSSession -ComputerName app01,app02 # 一次建立多台机器的会话
Invoke-Command -Session $s { Get-Date } # 复用会话执行,无需重复认证
Invoke-Command -Session $s { Get-Service W3SVC } | Select-Object PSComputerName, Status # 结果带来源主机
Get-PSSession # 查看当前会话清单
Disconnect-PSSession -Session $s[0] # 暂时断开,远端会话保留
Connect-PSSession -Session $s[0] # 稍后重连继续用
Remove-PSSession -Session $s # 全部释放命令分工
| 命令 | 作用 | 使用提示 |
|---|---|---|
| New-PSSession | 建立会话 | 可一次给多台主机建会话 |
| Invoke-Command -Session | 在会话上执行 | 结果含 PSComputerName 便于溯源 |
| Disconnect-PSSession | 断开但保留远端状态 | 适合临时断线的长流程 |
| Connect-PSSession | 重新接上断开的会话 | 受 IdleTimeout 限制 |
| Remove-PSSession | 彻底结束会话 | 脚本收尾必须做 |
巡检脚本的固定骨架就是这个顺序:建会话 → 批量取值 → 本地统一处理 → 清理会话。把清理写在 finally 块里,即使中途报错也不会留下悬挂会话。
断开与移除是两回事:断开后远端仍保留该会话及其变量,但超过空闲超时会被自动回收;移除后立刻结束,之后再用这条会话 ID 会报错。