PowerShell脚本报错:为何需重新声明New-PSSession变量?
问题原因分析
你的问题根源在于WinRM服务重启导致原有PSSession失效,具体逻辑如下:
- 你先执行
$Session = New-PSSession $env:hostname创建了一个PSSession,此时目标机器的WinRM服务处于正常运行状态,会话连接有效。 - 通过
Invoke-CimMethod执行Enable-PSRemoting -Force时,这个命令会自动触发WinRM服务的重启(这是Enable-PSRemoting的默认行为,目的是加载新的远程配置,比如启用监听、更新防火墙规则等)。 - WinRM服务重启后,所有已建立的PSSession会被强制断开——服务重启会销毁所有现存的会话连接池,此时你之前创建的
$Session变量指向的是一个已失效的会话对象,后续用它执行Invoke-Command或相关操作时,就会抛出Copy-Item : The runspace state is not valid for this operation错误。 - 重新执行
$Session = New-PSSession $env:hostname相当于在WinRM服务重启完成后,重新建立了一个新的有效会话,所以后续命令能正常执行。
额外补充
如果你的目标机器原本已经启用了PSRemoting,Enable-PSRemoting -Force依然会强制重置WinRM配置并重启服务,这也是为什么即使单独执行两段脚本没问题,但连续执行时旧会话会失效的原因——单独执行时,你可能是在WinRM重启后再创建的会话,而连续执行时旧会话在重启前就已经存在了。
内容的提问来源于stack exchange,提问作者DrixlRey
相关产品推荐
相关产品推荐

