将 for 循环的结果转换为 table

Conver the result of a for loop to a table

我无法将以下 for 循环转换为 table:

for ($i=1; $i -le 10; $i++) 
{ 
    $ErrorActionPreference= 'silentlycontinue' 
    Write-Progress -PercentComplete ((100*$i)/255) -Activity "Gathering IP's"  

    nslookup("192.168.2." + $i) | Format-Table
}

唯一发生的事情是对于每个无法访问的地址,它都会显示路由器 name/ip:

Server:  easy.box.local
Address:  192.168.2.1

Name:    easy.box.local
Address:  192.168.2.1

Server:  easy.box.local
Address:  192.168.2.1

我想像 table 一样对其进行排序,以使其更方便和更容易查看

您可以使用 regex 获取信息并创建一个新对象,使其可排序:

$ErrorActionPreference= 'silentlycontinue' 
for ($i=1; $i -le 10; $i++) 
{ 
    Write-Progress -PercentComplete ((100*$i)/255) -Activity "Gathering IP's"  

    $nsLookupResult = nslookup("192.168.2." + $i)
    [PSCustomObject]@{
        Server = [regex]::Match($nsLookupResult,'Server:\s+(\S+)').Groups[1].Value
        Address = [regex]::Match($nsLookupResult,'Address:\s+(\S+)').Groups[1].Value
    }
}

输出:

Server           Address        
------           -------        
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254
easy.box.loca 192.168.150.254

注意:可能有一个内置的 PowerShell cmdlet,这会使它过时。

注意 2: 您只需设置 $ErrorActionPreference 一次,这就是为什么我将其设置在 for 循环之外的原因。

如果您使用的是 Windows 8 或更高版本的计算机,您可以使用 [System.Net.Dns]::Resolve(请注意,不成功的查找会将 IP 地址作为主机名)

for ($i=1; $i -le 10; $i++) { 
    Write-Progress -PercentComplete ((100*$i)/255) -Activity "Gathering IP's"  
    [System.Net.Dns]::Resolve("192.168.2." + $i) | Select HostName,AddressList
}