У меня есть список ADComputers

$computers = Get-ADComputer -Filter {Name -like "Foo*"}

Я хочу видеть подмножество тех, которые находятся в сети и возвращают пинги прямо сейчас.

$results = @()
foreach ($computer in $computers) {
    if (Test-Connection -ComputerName $computer.Name -Count 1 -Quiet) {
        $results += $computer
    }
}

однако теперь я обнаружил, что мне нужен и объект ADComputer, и IPv4Address, возвращенный из TestConnection , поэтому я решил снова отфильтровать и обернуть компьютер в собственную хеш-таблицу вместе с возвращенным IPv4Address.

$results2 = @()
foreach ($result in $results) {
    $ipv4 = Test-Connection -ComputerName $result.Name -Count 1 | Select -ExpandProperty IPv4Address
    $results2 += @{Computer=$result; IPv4Address=$ipv4}
}

а затем получить мои результаты с

$results2 | Format-Table Computer.Name, IPv4Address

Однако мои результаты пустые

Computer.Name IPv4Address
------------- -----------
(many blank rows follow)

Как я могу получить ожидаемые результаты от этого? Или в качестве альтернативы: я лаю не на том дереве, и есть более простой способ сделать это?

3 ответа3

1
$results = foreach ($c in $computers)
{
    $ipv4 = Test-Connection -ComputerName $c.name -count 1 | select -expand IPV4Address
    [PSCustomObject]@{ "Computer" = $c.name ; "IPV4" = $($ipv4.IPAddressToString) }
}

вы получили эти пустые строки, потому что свойство IPV4Address содержит несколько свойств вместо одной строки. Свойство IPAddressToString содержит IPv4Address самостоятельно

ваш вывод будет сохранен в $results если вы хотите, чтобы они выводились напрямую, просто удалите переменную перед foreach

Я использовал PSCustomObject для этого, потому что мне нравится называть мои свойства, если вы хотите изменить это на hashtable , измените последнюю строку кода на:

[hashtable]@{ $c = $($ipv4.IPAddressToString) }
1

Попробуй это...

Clear-Host
(Get-ADComputer -Filter *).Name | %{
If (Test-Connection -ComputerName $_ -Count 1 -ErrorAction SilentlyContinue)
{
    Test-Connection -ComputerName $_ -Count 1 `
    | Select Address,ProtocolAddress,
    @{Name = 'Status';Expression = {'Online'}}
}
Else{$_ | Select @{Name = 'Address';Expression = {$_}},
@{Name = 'ProtocolAddress';Expression = {'NoAddress'}},
@{Name = 'Status';Expression = {'Offline'}}
}} | Format-Table -AutoSize

Результаты

Address  ProtocolAddress Status 
-------  --------------- ------ 
DC01     192.168.0.11    Online 
EX01     192.168.2.12    Online 
...
WS01     NoAddress       Offline
IIS01    192.168.7.11    Online
... 

Или вот еще один способ сделать то, что вы после

Clear-Host
(Get-ADComputer -Filter *).Name | %{
If (Test-Connection -ComputerName $_ -Count 1 -ErrorAction SilentlyContinue)
{Resolve-DnsName -Name $_ -Type A `
| Select Name,IPaddress,@{Name = 'Status';Expression = {'Online'}}}
Else{
Resolve-DnsName -Name $_ -Type A -ErrorAction SilentlyContinue `
| Select Name,IPaddress,@{Name = 'Status';Expression = {'Offline'}}
}}

Результаты

Name                       IPAddress     Status
----                       ---------     ------
DC01.contoso.com     192.168.0.11  Online
EX01.contoso.com     192.168.2.12  Online
...
WS01.contoso.com     192.168.8.30  Offline
IIS01.contoso.com    192.168.7.11  Online
...
-1

У меня есть сценарий PowerShell для этой конкретной задачи:

$computers = Get-Content "ListOfWrkStns_Jan18.txt"  

foreach ($computer in $computers) {  

    if (test-Connection -ComputerName $computer -Count 2 -Quiet ) {   

        "$computer is up."  

                } else  

                {"$computer is DOWN!"  

                }      

} 

Вам просто нужно создать файл «ListOfWrkStns.txt» (список рабочих станций), чтобы передать ему ввод всех имен компьютеров.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .