Я пытаюсь создать сценарий, который берет список из нескольких сотен машин, и мне бы хотелось, чтобы он выдал мне три вещи: 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"
Есть идеи, как установить тайм-аут, если машина не в сети? Спасибо!
Конечно, вы можете получить желаемую информацию из 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
сервер IpV4Addr IpTimeMs IpStatus ------ -------- -------- -------- google.com 216.58.201.110 115,6865 Включено 77.75.79.53 77.75.79.53 21,5296 Вкл. 192.168.1.1 192.168.1.1 13,8537 Вкл. 192.168.1.12 1252,0167 Произошла неисправимая ошибка во время ... bmw.com 3999,3424 Ошибка из-за нехватки ресурсов 160.46.244.131 3999,6292 Ошибка из-за нехватки ресурсов foo.bar 41,9088 Такой хост не известен
Сбор данных о тестировании исходит из этого моего ответа .