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

如何通过Invoke-Command -AsJob获取远程脚本中的$ip变量值?

如何从Invoke-Command作业中获取脚本块内的$ip变量值

你的脚本核心问题是远程脚本块没有输出要返回的$ip变量,而且传入的$ip参数完全多余(脚本内并未使用传入的值)。以下是修正方案:

1. 修正远程执行的脚本块

让脚本块明确返回需要的$ip值,或者直接返回DNS解析结果。两种写法任选:

写法1:直接返回IP地址(自动带PsComputerName属性)

Foreach($PCName in $PCNameArray) {
    $arrayJobs += Invoke-Command -Credential $cred -ScriptBlock { 
        $IPs = [System.Net.Dns]::GetHostAddresses("mail")
        $IPs[0] # 最后一行的表达式结果会自动作为返回值
    } -ComputerName $PCName -AsJob
}

写法2:返回自定义对象(明确ip属性,更直观)

Foreach($PCName in $PCNameArray) {
    $arrayJobs += Invoke-Command -Credential $cred -ScriptBlock { 
        $IPs = [System.Net.Dns]::GetHostAddresses("mail")
        # 构造自定义对象,包含需要的ip字段
        [PSCustomObject]@{
            ip = $IPs[0]
        }
    } -ComputerName $PCName -AsJob
}

2. 接收并处理作业结果

Receive-Job会返回远程脚本块的输出结果,且Invoke-Command的作业会自动为结果添加PsComputerName属性,直接提取即可:

# 等待所有作业完成
Wait-Job $arrayJobs | Out-Null

# 接收完成的作业结果,过滤掉失败的作业
$ResultArray = Receive-Job $arrayJobs | Where-Object { $_.State -eq 'Completed' }

# 清理作业资源,避免残留
Stop-Job $arrayJobs | Out-Null
Remove-Job $arrayJobs | Out-Null

3. 导出结果到CSV

这部分逻辑可以保留,因为结果已经包含PsComputerName和ip属性:

$ResultArray | Select-Object PsComputerName, ip | Export-Csv $OutputFile -NoTypeInformation -Delimiter ';' -Encoding UTF8

关键要点

  • PowerShell的脚本块默认返回最后一个表达式的执行结果,所以必须确保你要获取的变量/值是脚本块的最后输出内容。
  • 不需要传入无用的参数,远程脚本块内的DNS解析是独立执行的,和本地的$ip变量无关。
  • 作业完成后务必清理作业对象(Remove-Job),避免占用系统资源。

内容的提问来源于stack exchange,提问作者Ruslannnn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:16:17