Сценарии с psinfo - вывод IP и версии программного обеспечения?

Я пытаюсь создать сценарий, который принимает список из нескольких сотен машин, и я хотел бы, чтобы он выводил мне три вещи: IP-адрес, версию VMware и, конечно же, имя компьютера. Я не мог собрать все воедино и подумал, что попрошу о помощи.

Ниже приведены данные, которые выводятся в файл CSV, но я не уверен, как заставить его отображать IP. Я пробовал использовать другой синтаксис с "ping", но сценарий зависает на первой машине и никогда не пройдет мимо него.

for /f %%i in (C:\Temp\Computers.txt) do ( 

   echo Software on %%i >> C:\Temp\psinfovmware15.csv 

   psinfo64 -s \\%%i | find /i "VMware" >> C:\Temp\psinfovmware15.csv 

   echo IP Address on %%i >> C:\Temp\psinfovmware15.csv 

   ping \\%%i >> C:\Temp\psinfovmware15.csv 

) 

excel C:\Temp\psinfovmware15.csv

Кроме того, я нашел этот сценарий PowerShell ниже, который отображает имя компьютера и IP-адрес, но я бы хотел, чтобы он отображал версию VMware:

$servers = Get-Content "computers.txt"
$report = @()
ForEach ($server in $servers) {
  Try {
    $tempreport = New-Object PSObject
    $IP = ((Test-Connection -ea stop -Count 1 -comp $server).IPV4Address).IPAddresstoString
    $tempreport | Add-Member NoteProperty Server $server
    $tempreport | Add-Member NoteProperty Status "Up"
    $tempreport | Add-Member NoteProperty IP $ip
    $report += $tempreport
    } 
  Catch {
    $tempreport = New-Object PSObject
    $tempreport | Add-Member NoteProperty Server $server
    $tempreport | Add-Member NoteProperty Status "Down"    
    }
  }
$report | Export-Csv -NoTypeInformation "report.csv"

Есть идеи, как установить тайм-аут, если машина не в сети? Благодаря!

1 ответ

Конечно, вы можете получить желаемую информацию из psinfo64.exe в PowerShell следующим образом:

$psinfo64 = psinfo64.exe -s -nobanner \\$server 2>$Null|
    Where-Object { $_ -match "VMware" }

Следующий сценарий может помочь (извините, я не могу протестировать выше psinfo, используя мою текущую коллекцию тестовых данных):

$servers = Get-Content -Path 'D:\bat\files\30852528.txt' |
    Where-Object { $_.Substring( 0,1 ) -ne ';' } # refuse comment lines
$report = [System.Collections.ArrayList]::new()
ForEach ($server in $servers) {
    $IpTry = Measure-Command -Expression {
        $IpTest = Test-Connection -ErrorAction SilentlyContinue -Count 1 -ComputerName $server
    }
    if ( $null -eq $IpTest ) {
        $IpStatus = $Error[0].Exception.InnerException.Message
        $psinfo64, $IpV4Addr = [string]::Empty
    } else {

        $IpStatus = 'On'
        if ( $IpTest.Address -eq $IpTest.ProtocolAddress ) {
            $IpV4Addr = $IpTest.ProtocolAddress
        } else {
            $IpV4Addr = $IpTest.IpV4Address.IPAddressToString
        }
        $IpTest.Dispose()
        $psinfo64 = psinfo64.exe -s -nobanner \\$server 2>$Null|
            Where-Object { $_ -match "VMware" }
    }
    $null = $report.Add( 
        [PSCustomObject]@{
            server   = $server;
            IpV4Addr = $IpV4Addr;
            IpTimeMs = $IpTry.TotalMilliseconds;
            IpStatus = $IpStatus;
            psinfo64 = $psinfo64;
        }
    )
}
$report #| Export-Csv -NoTypeInformation "report.csv"

Выход:

D:\PShell\SF\1011340.ps1
server         IpV4Addr        IpTimeMs IpStatus  
------         --------        -------- --------  
google.com     216.58.201.110  115,6865 On 
77.75.79.53    77.75.79.53      21,5296 On 
192.168.1.1    192.168.1.1      13,8537 On 
192.168.1.12                  1252,0167 A non-recoverable error occurred during...
bmw.com                       3999,3424 Error due to lack of resources
160.46.244.131                3999,6292 Error due to lack of resources
foo.bar                         41,9088 No such host is known

Сбор данных тестирования исходит из этого моего ответа.

Другие вопросы по тегам