Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Получить имя ПК по IP адресу в локальной сети. (http://forum.oszone.net/showthread.php?t=339306)

f0r_ce 19-02-2019 12:48 2858753

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

Iska 19-02-2019 19:56 2858834

А глобальная цель какая?

megaloman 19-02-2019 21:04 2858847

Код:

@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 2858869

Цитата:

Цитата megaloman
chcp 437 »

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

megaloman 20-02-2019 11:02 2858968

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

Цитата:

Цитата Iska
А глобальная цель какая? »

Подозреваю, что без этого обойтись вполне можно

mwz 20-02-2019 11:28 2858973

Цитата:

Цитата megaloman
Я не встречал в сети имя компьютера с русскими буквами, сам никогда такое не делал, не уверен, что это возможно »

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

megaloman 20-02-2019 11:31 2858975

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 2859021

Цитата:

Цитата megaloman
mwz, Я не встречал в сети имя компьютера с русскими буквами, сам никогда такое не делал, не уверен, что это возможно, как минимум, очень вероятны проблемы при использовании софта. »

Возможно-возможно. Я делал во времена NT4. И проблемы возможны. Не в плане доступа или общения с машиной — в плане того, что не все программисты знают про иные языки, окромя латиницы, и плевали на иные кодовые страницы.

f0r_ce 21-02-2019 17:38 2859234

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

megaloman 21-02-2019 18:54 2859252

f0r_ce, Если в "имя_пк" нет "."
Код:

        FOR /F "delims=." %%i IN ("%IPName%") Do Set "IPName=%%i"

f0r_ce 22-02-2019 11:59 2859341

megaloman, спасибо за код. Только хотелось бы, чтобы после имени ПК не вставлялся символ перевода строки и возврата каретки.

f0r_ce 22-02-2019 12:41 2859345

Вот такой код получился.
Код:

:: Копировать в буфер обмена имя ПК с параметром в виде имени ПК при запуске данного файла
:: отключение вывода не информативных строчек
@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 2859370

f0r_ce, Вместо Echo
Код:

<nul (Set /P "IPName=%IPName%"|clip)
Цитата:

Цитата f0r_ce
:: задержка перед закрытием окна 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

Ежели всё-таки в имени компьютеров возможна кириллица, то на основе Ping без chcp 437
Код:

@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 2859374

Цитата:

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

Цитата:

chcp 1251
Ещё так chcp 866, если вдруг не заладилось.

f0r_ce 26-02-2019 11:10 2860067

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 2860081

Цитата:

о не понятно, почему не получается написать по русски строчку "Echo Computer ......
потому, что батник надо сохранять в 866 кодировке и поместить chcp 866 >nul после скобки с циклом с ping.

f0r_ce 26-02-2019 12:32 2860097

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



Время: 12:43.

Время: 12:43.
© OSzone.net 2001-