如何通过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
相关产品推荐
相关产品推荐

