Войти

Показать полную графическую версию : Сопоставление серверов и IP


EDIsaev
23-07-2013, 11:19
В локальной сети получаю список серверов командой
net view, получаю ответ в следующем виде
Servername Beschreibung

------------------------------------------------
\\MACBOOKPRO-C690 Daniels MacBook Pro
\\PLATZ1203
\\PLATZ1405
\\PLATZ1407
\\PLATZ1409
\\PLATZ1413
\\PLATZ1418
\\PLATZ1419
\\PLATZ1420
\\PLATZ1422
\\PLATZ1423
\\PLATZ1439
\\PLATZ302
\\PLATZ505
\\PLATZ507
\\PLATZ509
\\PLATZ510
\\PLATZ511

потом нужно каждому серверу сопоставить IP с помощью nslookup PLATZ1405
Server: ipfire.server.org
Address: 192.168.0.157

Name: platz1405.server.org
Address: 192.168.0.51

в результате нужен список в виде:
1. Servername="PLATZ1405", IP="192.168.0.51"
2.
...

начал так:
@echo off
for /f "tokens=* delims=\" %%i in ('net view^|Find "\"') do (echo %%i)
pause

Проблемы:
1. первое имя получаю вместе с описанием
MACBOOKPRO-C690 Daniels MacBook Pro
как его отрезать?
2. при nslookup как отпарсить именно второе вхождение Address: , а не первое?

Sphinx114
23-07-2013, 12:42
@echo off
for /f "delims=\ " %%i in ('net view ^| find "\"') do (
set /a count+=1
for /f "skip=1 tokens=2" %%a in ('"nslookup %%i 2>nul | findstr Address"') do (
call echo %%count%%. Servername="%%i", IP="%%a">>list.txt
))

Iska
23-07-2013, 13:25
PowerShell:
net.exe view | Select-String -Pattern "\\\\(.*?) " | ForEach-Object -Process {
$IPHostEntry = [Net.Dns]::GetHostEntry($_.Matches[0].Groups[1].Value)

Write-Host $("{0, -30}" -f $IPHostEntry.HostName) -NoNewline

$IPHostEntry.AddressList | ForEach-Object -Process {
Write-Host $("{0, -17}" -f $_.IPAddressToString) -NoNewline
}
Write-Host
}

EDIsaev
23-07-2013, 14:09
Sphinx114, спасибо большое! Всё правильно
я пробовал с пробелом "delims=\ " результат был тот же, что и без него...
не подумал, что tokens=* всё портил)

по второму циклу пара вопросов
"skip=1 tokens=2" это ищем 2 вхождения и первое игнорируем?
для чего 2>nul не понял, без него работает вроде так же

а ещё вопрос не по реализации, а по используемым мною командам
может есть способ проще? может какая-то команда показывает сразу и IP и имена, а я не нашёл?


PowerShell: »
Спасибо тоже, для общего развития... но у меня XP там вроде надо его отдельно устанавливать, пока необходимости не вижу

Iska
23-07-2013, 14:35
"skip=1 tokens=2" это ищем 2 вхождения и первое игнорируем? »
Пропускаем первую («skip=1») из отфильтрованных по «Address» строк:
Address: 192.168.0.157
Address: 192.168.0.51
Берём только второй токен («tokens=2»).

для чего 2>nul не понял, без него работает вроде так же »
Поскольку вывод и так фильтруется по «Address» — действительно, не особо нужен. Но так — правильнее.

а ещё вопрос не по реализации, а по используемым мною командам
может есть способ проще? »
Чаще делают опрос AD на предмет перечня машин, а не «net.exe view».

может какая-то команда показывает сразу и IP и имена, а я не нашёл? »
Нет.

Sphinx114
23-07-2013, 16:13
tokens=2 »
Разделители подстрок по умолчанию (delims) это таб и пробел. tokens=2 это вторая подстрока в строке, она присваивается переменной %%a
для чего 2>nul не понял »
Да я в ком строке проверял и разок еггог вылез (*** Can't find server name for address x.x.x.x: Timed out) , на всякий случай его нейтрализовал, хотя да, на stdin фаиндстра оно не идёт.

sunnykey
23-07-2013, 16:22
Цитата EDIsaev:
может какая-то команда показывает сразу и IP и имена, а я не нашёл? »
Нет. »
Только если в powershell
Test-connection "ya.ru"

Iska
23-07-2013, 17:00
sunnykey, это, фактически, тот же «Win32_PingStatus».




© OSzone.net 2001-2012