Показать полную графическую версию : [решено] Получить имя ПК по IP адресу в локальной сети.
Здравствуйте. Помогите, пожалуйста, найти способ получения имени компьютера в сети по известному IP адресу.
В итоге требуется скопировать имя ПК в буфер обмена. Но для начала, мне бы найти способ извлечь имя ПК по IP адресу.
При выполнении команды ping -a <ip адрес> получается слишком много данных. Не могу придумать как из них выделить только имя ПК и передать в переменную.
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
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
А глобальная цель какая? » Подозреваю, что без этого обойтись вполне можно
Я не встречал в сети имя компьютера с русскими буквами, сам никогда такое не делал, не уверен, что это возможно »
Ещё как возможно — почему и спросил. :(
Из-за чего имели некогда ряд проблем при обслуживании таких компьютеров в сети (досталась по наследству: компы эти не мы ставили).
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
mwz, Я не встречал в сети имя компьютера с русскими буквами, сам никогда такое не делал, не уверен, что это возможно, как минимум, очень вероятны проблемы при использовании софта. »
Возможно-возможно. Я делал во времена NT4. И проблемы возможны. Не в плане доступа или общения с машиной — в плане того, что не все программисты знают про иные языки, окромя латиницы, и плевали на иные кодовые страницы.
Огромное спасибо за код. Глобальная цель: из известного IP получить имя ПК с последующим копированием в буфер обмена. Только загвоздка вышла: имя ПК получается в виде "имя_пк.название_домена" и ни как не получается отрезать лишнее...
megaloman
21-02-2019, 18:54
f0r_ce, Если в "имя_пк" нет "." FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"
megaloman, спасибо за код. Только хотелось бы, чтобы после имени ПК не вставлялся символ перевода строки и возврата каретки.
Вот такой код получился.
:: Копировать в буфер обмена имя ПК с параметром в виде имени ПК при запуске данного файла
:: отключение вывода не информативных строчек
@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
А если в имени компьютера есть русские буквы? »
chcp 1251
Ещё так chcp 866, если вдруг не заладилось.
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.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.