You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在远程会话中设置本地变量并修改传入对象属性?

在Invoke-Command远程会话中修改本地传入对象的属性

PowerShell远程会话中,通过Invoke-Command传入的对象是经过序列化/反序列化的副本,远程修改副本不会直接同步到本地变量。要实现修改后同步,需要将修改后的对象返回并覆盖本地变量,具体操作如下:

基础实现步骤

  1. 定义本地全局配置变量
$Global:Config = [PSCustomObject]@{
    ServerName = "OldDBServer"
    ListenPort = 1433
    IsActive = $true
}
  1. 远程修改并返回对象
    通过-ArgumentList传入本地变量,在远程脚本块中修改属性后返回,最后将返回值重新赋值给本地全局变量:
# 远程修改配置并同步回本地
$Global:Config = Invoke-Command -ComputerName RemoteHost01 -ScriptBlock {
    param($LocalConfig)
    # 修改目标属性
    $LocalConfig.ServerName = "NewDBServer"
    $LocalConfig.ListenPort = 1434
    $LocalConfig.IsActive = $false
    # 返回修改后的对象
    $LocalConfig
} -ArgumentList $Global:Config
  1. 验证本地变量更新
# 查看修改后的全局变量
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:30:57