Я пытаюсь создать сценарий, который принимает список из нескольких сотен машин, и я хотел бы, чтобы он выводил мне три вещи: 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
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
Сбор данных тестирования происходит от это мой ответ.