首页 > 解决方案 > Powershell 中的格式化列表问题

问题描述

我想在每台服务器(160+)上执行几行代码。为此,我决定通过 Powercli 获取我的服务器列表并将此列表传递给Enter-PSSession.

...
Connect-VIServer -Server $VIServer -Credential $creds
$servers = Get-VM |select Name |where Name -Like "SV*"
...

foreach($server in $servers)
{
    try{
        Enter-PSSession -ComputerName $server -Credential $cred -ErrorAction Stop
            Get-NetIPAddress |where AddressFamily -EQ 2 |where InterfaceAlias -Like "Ethernet" |select IPAddress
        Exit-PSSession
    }catch{
        Write-Host "Error on $server"
    }
}

问题似乎是,它需要一个数组,因为输出错误如下

Error on @{Name=<$server>}

但我不知道如何正确处理

标签: powershell

解决方案


使用New-PssessionInvoke-command进行远程处理。Enter-Pssession是交互式的,并且您正在执行它的方式,它get-netipaddress在您的本地计算机上而不是在您的远程计算机上运行。

在你的循环中使用$servers.Name而不是。$serversforeach

foreach($server in $servers.Name) #This .name should fix your problem
{
    try{
        New-PSSession -ComputerName $server -Credential $cred -ErrorAction Stop -Name MySession
        Invoke-Command -Session $MySession -ScriptBlock {Get-NetIPAddress |where AddressFamily -EQ 2 |where InterfaceAlias -Like "Ethernet" |select IPAddress}
        Remove-PSSession
    }catch{
        Write-Host "Error on $server"
    }
}

推荐阅读