Войти

Показать полную графическую версию : [решено] Получить имя ПК по IP адресу в локальной сети.


f0r_ce
19-02-2019, 12:48
Здравствуйте. Помогите, пожалуйста, найти способ получения имени компьютера в сети по известному IP адресу.
В итоге требуется скопировать имя ПК в буфер обмена. Но для начала, мне бы найти способ извлечь имя ПК по IP адресу.
При выполнении команды ping -a <ip адрес> получается слишком много данных. Не могу придумать как из них выделить только имя ПК и передать в переменную.

Iska
19-02-2019, 19:56
А глобальная цель какая?

megaloman
19-02-2019, 21:04
@Echo Off
cls
Set "IP=192.168.125.223"

chcp 437 >nul
Set "Key1=Pinging"
Set "IPname=Not Found"
FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`2^>nul Ping -a -n 1 -4 %IP%`) DO (
If /I "%Key1%"=="%%i" If /I "[%IP%]"=="%%k" Set "IPname=%%j"
)
Echo %IPname%
pause

mwz
19-02-2019, 21:48
chcp 437 »

А если в имени компьютера есть русские буквы?

megaloman
20-02-2019, 11:02
mwz, Я не встречал в сети имя компьютера с русскими буквами, сам никогда такое не делал, не уверен, что это возможно, как минимум, очень вероятны проблемы при использовании софта. Как вариант @Echo Off
cls
Set "IP=192.168.100.23"

Set "IPname=Not Found"
Set "N="
FOR /F "usebackq tokens=1,2 delims=<>" %%i IN (`2^>nul nbtstat -a %IP%`) DO (
If "%%j"=="00" (Call Set "IPname%%N%%=%%i" &Call Set /A N+=1)
)
If /I Not "%IPname%"=="Not Found" Set "IPname=%IPname: =%"
Echo %IPname%
pause
А глобальная цель какая? » Подозреваю, что без этого обойтись вполне можно

mwz
20-02-2019, 11:28
Я не встречал в сети имя компьютера с русскими буквами, сам никогда такое не делал, не уверен, что это возможно »

Ещё как возможно — почему и спросил. :(
Из-за чего имели некогда ряд проблем при обслуживании таких компьютеров в сети (досталась по наследству: компы эти не мы ставили).

megaloman
20-02-2019, 11:31
mwz, Ну, раз пошла такая пьянка, вот еще вариант@Echo Off
cls
Set "IP=192.168.100.23"

FOR /F "usebackq delims=" %%i IN (`2^>nul Ping -a -n 1 -4 %IP%`) DO Call :NameIP %IP% "IPName" %%i &GoTo :Continue
:Continue
Echo %IPName%
pause
GoTo :Eof

:NameIP
Set "%~2=Not Found"
If "%4"=="" GoTo :Eof
If "%4"=="[%1]" (Set "%~2=%3" &GoTo :Eof)
Shift /3
GoTo :NameIP
GoTo :Eof

Iska
20-02-2019, 16:49
mwz, Я не встречал в сети имя компьютера с русскими буквами, сам никогда такое не делал, не уверен, что это возможно, как минимум, очень вероятны проблемы при использовании софта. »
Возможно-возможно. Я делал во времена NT4. И проблемы возможны. Не в плане доступа или общения с машиной — в плане того, что не все программисты знают про иные языки, окромя латиницы, и плевали на иные кодовые страницы.

f0r_ce
21-02-2019, 17:38
Огромное спасибо за код. Глобальная цель: из известного IP получить имя ПК с последующим копированием в буфер обмена. Только загвоздка вышла: имя ПК получается в виде "имя_пк.название_домена" и ни как не получается отрезать лишнее...

megaloman
21-02-2019, 18:54
f0r_ce, Если в "имя_пк" нет "." FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"

f0r_ce
22-02-2019, 11:59
megaloman, спасибо за код. Только хотелось бы, чтобы после имени ПК не вставлялся символ перевода строки и возврата каретки.

f0r_ce
22-02-2019, 12:41
Вот такой код получился.

:: Копировать в буфер обмена имя ПК с параметром в виде имени ПК при запуске данного файла
:: отключение вывода не информативных строчек
@echo off >nul
if "%1"=="" (set INFO=echo && set THEEND=1) else (set INFO=rem && set THEEND=0)
%INFO% ***********************************************************************
%INFO% *
%INFO% * Не введён параметр - IP ПК
%INFO% *
%INFO% ***********************************************************************
if "%THEEND%"=="1" (echo Ошибка: Задайте имя компьютера!)&(goto :exit)

Set "IP=%1"
:: с помощью ping извлекаем имя ПК из IP
:: Если вместо %переменная% взять %переменная:~начало,длина% - получим часть строки сначала, если со знаком минус, то с конца
chcp 437 >nul
Set "Key1=Pinging"
Set "IPname=Not Found"
FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`2^>nul Ping -a -n 1 -4 %IP%`) DO (
If /I "%Key1%"=="%%i" If /I "[%IP%]"=="%%k" Set "IPname=%%j"
)
:: берём только часть имени ПК до точки
FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"
Echo Имя ПК: %IPname%
:: скопировать в буфер обмена текст из параметров / данная команда работает только в ОС начиная с Windows 7
echo %IPname%|clip
:: задержка перед закрытием окна 30 сек
ping -n 1 -w 30000 10.10.254.254 >nul
goto :exit2
:: выход, если не переданы параметры
:exit
pause
:: выход если всё хорошо
:exit2

megaloman
22-02-2019, 15:02
f0r_ce, Вместо Echo <nul (Set /P "IPName=%IPName%"|clip)
:: задержка перед закрытием окна 30 сек
ping -n 1 -w 30000 10.10.254.254 >nul »>nul Timeout /T 30@Echo Off
If "%~1"=="" (
cls
Echo ***********************************************************************
Echo *
Echo * Не введён параметр - IP ПК
Echo *
Echo ***********************************************************************
Echo !!! Ошибка: Задайте имя компьютера!
Echo.
Pause
Exit /B 1
)
Set "IP=%~1"

Rem C помощью ping извлекаем имя ПК из IP
chcp 437 >nul
Set "Key1=Pinging"
Set "IPname=Not Found"
FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`2^>nul Ping -a -n 1 -4 %IP%`) DO (
If /I "%Key1%"=="%%i" If /I "[%IP%]"=="%%k" Set "IPname=%%j"
)

Rem Ip Not Found
If "%IPname%"=="Not Found" (
Cls
Echo !!! Echo Computer with IP=%IP% not found
Echo.
Pause
Exit /B 2
)

Rem Берём только часть имени ПК до точки
FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"
Echo Имя ПК: %IPname%

Rem Cкопировать в буфер обмена текст из параметров / данная команда работает только в ОС начиная с Windows 7
<nul (Set /P "IPName=%IPName%"|clip)

Rem задержка перед закрытием окна 30 сек
>nul Time /T 30

Exit /B 0
@Echo Off
If "%~1"=="" (
cls
Echo ***********************************************************************
Echo * Не введён параметр - IP ПК
Echo ***********************************************************************
Echo !!! Ошибка: Задайте имя компьютера!
Echo.
Pause
Exit /B 1
)
Set "IP=%~1"

Rem C помощью ping извлекаем имя ПК из IP
FOR /F "usebackq delims=" %%i IN (`2^>nul Ping -a -n 1 -4 %IP%`) DO (
Call :NameIP %IP% "IPName" %%i ||(

Rem Ip Not Found
Cls
Echo !!! Echo Computer with IP=%IP% not found
Echo.
Pause
Exit /B 2
)
GoTo :Continue
)
:Continue
FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"

Rem Берём только часть имени ПК до точки
FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"
Echo Имя ПК: %IPname%

Rem Cкопировать в буфер обмена текст из параметров / данная команда работает только в ОС начиная с Windows 7
<nul (Set /P "IPName=%IPName%"|clip)

Rem задержка перед закрытием окна 30 сек
>nul Time /T 30

Exit /B 0

:NameIP
Set "%~2=Not Found"
If "%4"=="" Exit /B 2
If "%4"=="[%1]" (Set "%~2=%3" &Exit /B 0)
Shift /3
GoTo :NameIP
Exit /B 2

yurfed
22-02-2019, 15:32
А если в имени компьютера есть русские буквы? »
chcp 1251
Ещё так chcp 866, если вдруг не заладилось.

f0r_ce
26-02-2019, 11:10
megaloman, спасибо за правки.

:: Копировать в буфер обмена имя ПК с параметром в виде имени ПК при запуске данного файла
@Echo Off & rem отключение вывода не информативных строчек
If "%~1"=="" (
cls
Echo ***********************************************************************
Echo *
Echo * Не введён параметр - IP ПК
Echo *
Echo ***********************************************************************
Echo !!! Ошибка: Задайте имя компьютера!
Echo. & rem вывод пустой строки
Pause
Exit /B 1
)
Set "IP=%~1"

Rem C помощью ping извлекаем имя ПК из IP
chcp 437 >nul
Set "Key1=Pinging"
Set "IPname=Not Found"
FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`2^>nul Ping -a -n 1 -4 %IP%`) DO (
If /I "%Key1%"=="%%i" If /I "[%IP%]"=="%%k" Set "IPname=%%j"
)

Rem Ip Not Found
If "%IPname%"=="Not Found" (
Cls
Echo Computer with IP = %IP% not found
Echo.
Pause
Exit /B 2
)

Rem Берём только часть имени ПК до точки
FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"
chcp 866 >nul
Echo Имя ПК: %IPname%

Rem Cкопировать в буфер обмена текст из переменной / данная команда работает только в ОС начиная с Windows 7
<nul (Set /P "IPName=%IPName%"|clip)

Rem задержка перед закрытием окна 10 сек
>nul Timeout /T 10

Exit /B 0

Только не понятно, почему не получается написать по русски строчку "Echo Computer with IP = %IP% not found" даже если перед этим переключить кодировку на 1251 или 866?

megaloman
26-02-2019, 11:56
о не понятно, почему не получается написать по русски строчку "Echo Computer ......потому, что батник надо сохранять в 866 кодировке и поместить chcp 866 >nul после скобки с циклом с ping.

f0r_ce
26-02-2019, 12:32
megaloman, спасибо. Задача выполнена :yahoo:

REM Копировать в буфер обмена имя ПК с параметром в виде имени ПК при запуске данного файла
@Echo Off & rem отключение вывода не информативных строчек
If "%~1"=="" (
cls
Echo ***********************************************************************
Echo *
Echo * Не введён параметр - IP ПК
Echo *
Echo ***********************************************************************
Echo !!! Ошибка: Задайте имя компьютера!
Echo. & rem вывод пустой строки
Pause
Exit /B 1
)
Set "IP=%~1"

Rem C помощью ping извлекаем имя ПК из IP
chcp 437 >nul
Set "Key1=Pinging"
Set "IPname=Not Found"
FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`2^>nul Ping -a -n 1 -4 %IP%`) DO (
If /I "%Key1%"=="%%i" If /I "[%IP%]"=="%%k" Set "IPname=%%j"
)

Rem Выход, если Ip не найден
chcp 866 >nul
If "%IPname%"=="Not Found" (
Cls
Echo Компьютер с IP = %IP% не найден 
Echo.
Pause
Exit /B 2
)

Rem Берём только часть имени ПК до точки
FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"
Echo Имя ПК: %IPname%

Rem Cкопировать в буфер обмена текст из переменной / данная команда работает только в ОС начиная с Windows 7
<nul (Set /P "IPName=%IPName%"|clip)

Rem задержка перед закрытием окна 10 сек
>nul Timeout /T 10

Exit /B 0




© OSzone.net 2001-2012