如何在远程会话中设置本地变量并修改传入对象属性?
在Invoke-Command远程会话中修改本地传入对象的属性
PowerShell远程会话中,通过Invoke-Command传入的对象是经过序列化/反序列化的副本,远程修改副本不会直接同步到本地变量。要实现修改后同步,需要将修改后的对象返回并覆盖本地变量,具体操作如下:
基础实现步骤
- 定义本地全局配置变量
$Global:Config = [PSCustomObject]@{ ServerName = "OldDBServer" ListenPort = 1433 IsActive = $true }
- 远程修改并返回对象
通过-ArgumentList传入本地变量,在远程脚本块中修改属性后返回,最后将返回值重新赋值给本地全局变量:
# 远程修改配置并同步回本地 $Global:Config = Invoke-Command -ComputerName RemoteHost01 -ScriptBlock { param($LocalConfig) # 修改目标属性 $LocalConfig.ServerName = "NewDBServer" $LocalConfig.ListenPort = 1434 $LocalConfig.IsActive = $false # 返回修改后的对象 $LocalConfig } -ArgumentList $Global:Config
- 验证本地变量更新
# 查看修改后的全局变量 $Global:Config
进阶:持久会话多次修改
如果需要在同一个远程会话中多次修改对象,可以建立持久会话,避免重复连接开销:
# 建立持久远程会话 $remoteSession = New-PSSession -ComputerName RemoteHost01 # 第一次修改并同步 $Global:Config = Invoke-Command -Session $remoteSession -ScriptBlock { param($Cfg) $Cfg.ServerName = "TempDBServer" $Cfg } -ArgumentList $Global:Config # 第二次修改并同步 $Global:Config = Invoke-Command -Session $remoteSession -ScriptBlock { param($Cfg) $Cfg.ListenPort = 1435 $Cfg } -ArgumentList $Global:Config # 关闭会话 Remove-PSSession $remoteSession
关键注意事项
- 所有传入远程会话的对象都会被序列化为CliXml格式,远程拿到的是独立副本,无法直接通过内存引用修改本地对象,必须通过返回值同步。
- 对于值类型(如字符串、整数)或不可变对象,修改后返回赋值是唯一的同步方式;对于自定义对象(如PSCustomObject),同样遵循此规则。
内容的提问来源于stack exchange,提问作者noobie
相关产品推荐
相关产品推荐

