Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] nslookup для парка ПК

Ответить
Настройки темы
CMD/BAT - [решено] nslookup для парка ПК

Пользователь


Сообщения: 144
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: HFShak
Дата: 05-10-2011
Добрый день!
Народ, помогите пожалуйста написать скрипт.
Есть файл pc.txt , в котором содержутся имена компьютеров.

Содержание pc.txt:

NAMEPC1
NAMEPC2
NAMEPC3
...


В текстовом файле на каждой строке по одному имени ПК, имена не содержат общих элементов и длинна имен может различаться по кол-ву символов.
Нужно написать скрипт, который для кажного ПК выполняет команду nslookup.
Все собранные данные записываются с один текстовый файл report.txt, желательно в таком порядке:

NAMEPC1 = 10.4.27.7
NAMEPC2 = *** srv.domain.ru не удалось найти NAMEPC2: Non-existent domain
NAMEPC3 = 10.12.16.14
...

Отправлено: 16:59, 05-10-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


HFShak, попробуйте так:
читать дальше »
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sFileSource=%~1
set sLog=%~2

if defined sFileSource (
	if defined sLog (
		if exist "%sFileSource%" (
			>nul copy nul "%sLog%"

			for /f "usebackq tokens=*" %%i in ("%sFileSource%") do (
				set sName=
				set sAddresses=

				for /f "tokens=1,2* delims=,:	 " %%j in ('nslookup "%%i" 2^>^&1 ^| findstr.exe /r /i /c:"Name:    " /c:"Addresses:  " /c:"\*\*\* "') do (
					if "%%j" equ "***" (
						set s%%j=%%k %%l
					) else (
						set s%%j=%%k
					)
				)

				>>"%sLog%" (
					if defined sName (
						echo !sName! = !sAddresses!
					) else (
						echo %%i = !s***!
					)
				)
			)
		) else (
			echo File with Names list [%sFileSource%] not found
		)
	) else (
		call :Usage
		exit /b 1
	)
) else (
	call :Usage
	exit /b 1
)

endlocal
exit /b 0

:Usage
	echo Usage: %~nx0 ^<Names list^> ^<Log file^>
	exit /b 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:36, 05-10-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 144
Благодарности: 0

Профиль | Отправить PM | Цитировать


sFileSource=%userprofile%\desktop\pc.txt
sLog=%userprofile%\desktop\report.txt

Я правильно задал переменные?, никакие знаки "%" не упустил?

Программа подвисает сильно во время выполнения, в процесса появляется очень много cmd.exe. Завершил задачу, т.к. начали появлятся диалоговые окна с ошибками cmd.
Файл report.txt заполняется так:
PCNAME1 =
PCNAME2 =
PCNAME3 =
...

После равно не появляется ip.

Отправлено: 09:19, 06-10-2011 | #3



Moderator


Сообщения: 53482
Благодарности: 15510

Профиль | Отправить PM | Цитировать


Цитата HFShak:
в процесса появляется очень много cmd.exe
И как же вы назвали CMD-файл? Только не говорите, что nslookup.cmd (или .bat).
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:24, 06-10-2011 | #4


Пользователь


Сообщения: 144
Благодарности: 0

Профиль | Отправить PM | Цитировать


Блин именно nslookup.cmd )
Переименовал в 123.cmd, скрип отработал, файл почти правильно заполнился, т.е.:

PCNAME1 =
PCNAME2 =
PCNAME3 = srv.domain.ru *Ґ г¤ «®бм * ©вЁ PCNAME3: Non-existent domain
PCNAME4 = srv.domain.ru *Ґ г¤ «®бм * ©вЁ PCNAME4: Non-existent domain
PCNAME5 = srv.domain.ru *Ґ г¤ «®бм * ©вЁ PCNAME5: Non-existent domain
PCNAME6 = srv.domain.ru *Ґ г¤ «®бм * ©вЁ PCNAME6: Non-existent domain
...

Не прописывается ip адрес у тех ПК, которые реализовываются на dns.

Отправлено: 09:25, 06-10-2011 | #5



Moderator


Сообщения: 53482
Благодарности: 15510

Профиль | Отправить PM | Цитировать


HFShak, попробуйте в скрипте заменить Addresses на Address.

Отправлено: 09:39, 06-10-2011 | #6


Пользователь


Сообщения: 144
Благодарности: 0

Профиль | Отправить PM | Цитировать


В скрипте какая-то ошибка:


Код: Выделить весь код
C:\>setlocal enableextensions enabledelayedexpansion

C:\>set sFileSource=C:\pc.txt

C:\>set sLog=C:\report.txt

C:\>if defined sFileSource (if defined sLog (if exist "C:\pc.txt" (copy nul "C:\report.txt" 1>nul for /F "usebackq tokens=*" %i in ("C:\pc.txt") 
do (
set sName= 
set sAddress= 
for /F "tokens=1,2* delims=,:   " %j in ('nslookup "%i" 2>&1 | findstr.exe /r /i /c:"Name:    " /c:"Address:  " /c:"\*\*\* "') 
do (if "%j" EQU "***" (set s%j=%k %l )  else (set s%j=%k ) )
 (if defined sName (echo !sName! = !sAddress! )  else (echo %i = !s***! ) ) 1>>"C:\report.txt"))  
	else (echo File with Names list [C:\pc.txt] not found ) )  else (call :Usage exit /b 1) )  else (call :Usage exit /b 1)





C:\>(
set sName= 
set sAddress= 
for /F "tokens=1,2* delims=,:   " %j in ('nslookup "PCNAME1" 2>&1 | findstr.exe /r /i /c:"Name:    " /c:"Address:  " /c:"\*\*\* "') do (if "%j" EQU "***" 
(set s%j=%k %l )  else (set s%j=%k ) )
(if defined sName (echo !sName! = !sAddress! )  else (echo PCNAME1 = !s***! )) 1>>"C:\report.txt")

C:\>(if "Address" EQU "***" (set sAddress=10.4.27.7  )  else (set sAddress=10.4.27.7 ) )

C:\>(if "Address" EQU "***" (set sAddress=10.1.92.228  ) else (set sAddress=10.1.92.228 ) )

C:\>(
set sName=
set sAddress=
for /F "tokens=1,2* delims=,:   " %j in ('nslookup "PCNAME2" 2>&1 | findstr.exe /r /i /c:"Name:    " /c:"Address:  " /c:"\*\*\* "') do (if "%j" EQU "***" 
(set s%j=%k %l )  else (set s%j=%k ) ) 
(if defined sName (echo !sName! = !sAddress! )  else (echo PCNAME2 = !s***! )) 1>>"C:\report.txt")

C:\>(if "Address" EQU "***" (set sAddress=10.4.27.7  )  else (set sAddress=10.4.27.7 ) )

C:\>(if "Address" EQU "***" (set sAddress=10.1.92.127  ) else (set sAddress=10.1.92.127 ) )

C:\>(
set sName=
set sAddress=
for /F "tokens=1,2* delims=,:   " %j in ('nslookup "PCNAME3" 2>&1 | findstr.exe /r /i /c:"Name:    " /c:"Address:  " /c:"\*\*\* "') do (if "%j" EQU "***"
(set s%j=%k %l )  else (set s%j=%k ) )
(if defined sName (echo !sName! = !sAddress! )  else (echo PCNAME3 = !s***! ) ) 1>>"C:\report.txt")

C:\>(if "***" EQU "***" (set s***=srv.domain.ru не удалось )  else (set s***=srv.domain.ru ) ) main

C:\>(if "Address" EQU "***" (set sAddress=10.4.27.7  )  else (set sAddress=10.4.27.7 ) )

C:\>(
set sName=
set sAddress=
for /F "tokens=1,2* delims=,:   " %j in ('nslookup "PCNAME4" 2>&1 | findstr.exe /r /i /c:"Name:    " /c:"Address:  " /c:"\*\*\* "') do (if "%j" EQU "***"
(set s%j=%k %l )  else (set s%j=%k ) )
(if defined sName (echo !sName! = !sAddress! )  else (echo PCNAME4 = !s***! ) ) 1>>"C:\report.txt")

C:\>(if "***" EQU "***" (set sAddress=10.4.27.7 )  else (set sAddress=10.4.27.7 ) ) 

C:\>(if "Address" EQU "***" (set sAddress=10.1.92.23  )  else (set sAddress=10.1.92.23 ) )
По факту:
У PCNAME1 ip адрес = 10.1.92.22
У PCNAME2 ip адрес = 10.1.92.127
У PCNAME3 ip адрес = не удалось
У PCNAME4 ip адрес = 10.1.92.23

В файле он записывает так:
PCNAME1 =
PCNAME2 =
PCNAME3 = srv.domain.ru *Ґ г¤*«®бм **©вЁ PCNAME3: Non-existent domain
PCNAME4 = srv.domain.ru *Ґ г¤*«®бм **©вЁ PCNAME4: Non-existent domain

Отправлено: 10:40, 06-10-2011 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Petya V4sechkin:
И как же вы назвали CMD-файл? Только не говорите, что nslookup.cmd (или .bat). »
Моя вина. Сколько раз, сколько раз сам же зарекался обязательно писать расширения у исполняемых файлов… И опять пропустил.


HFShak, пакетный файл весьма критично зависит от формата вывода утилиты. Я ориентировался на вывод «nslookup.exe» из комплекта Windows XP SP3. При разработке использовал перечень общеизвестных доменных имён (не локальных!) и несколько заведомо несуществующих.

Посему проделайте следующее:

читать дальше »
1. Подготовьте образец с реальными именами машин:
Цитата HFShak:
Содержание pc.txt:
NAMEPC1
NAMEPC2
NAMEPC3
... »
Достаточно будет три-четыре существующих имени, и пары несуществующих/отсутствующих.

2. Вручную проделайте операцию запроса «nslookup.exe» с каждым из подготовленных имён в «pc.txt», каждый раз перенаправляя вывод StdOut и StdErr в файл, наподобие:
Код: Выделить весь код
>nul copy nul Out.txt
>>Out.txt nslookup.exe PCNAME1 2>&1
>>Out.txt nslookup.exe PCNAME2 2>&1
…
>>Out.txt nslookup.exe NONEXISTPCNAME 2>&1
3. Обязательно упакуйте файлы «pc.txt» и «Out.txt» в архив, затем отошлите мне его в личку (либо выложите его на обменник, а ссылку, опять же — в личку).

В этом случае я смогу составить представление о формате вывода утилиты в Вашем случае и, возможно, помочь.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:00, 06-10-2011 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


HFShak, я был несколько ошарашен, когда увидел вывод Вашей «nslookup.exe»: в stdout в Ansi, в stderr — в OEM.

Попробуйте очередной вариант:
читать дальше »
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sFileSource=%~1
set sLog=%~2

call :GetTemporaryName
set sStdOut=%TemporaryName%

call :GetTemporaryName
set sStdErr=%TemporaryName%

if defined sFileSource (
	if defined sLog (
		if exist "%sFileSource%" (
			>nul copy nul "%sLog%"
			
			for /f "usebackq tokens=*" %%i in ("%sFileSource%") do (
				echo Processing [%%i]...
				set sName=
				set sAddress=
				set bCriticalError=
				
				nslookup.exe "%%i" 1>"%sStdOut%" 2>"%sStdErr%"
				
				<"%sStdErr%" set /p sError=
				
				if defined sError (
					if "!sError:~0,3!" equ "***" (
						>>"%sLog%" echo %%i = !sError!
						set bCriticalError=1
					)
				)
				
				if not defined bCriticalError (
					set /a iCount = 0
					for /f "usebackq skip=3 tokens=2 delims=,:	 " %%j in ("%sStdOut%") do (
						set /a iCount += 1
						
						if !iCount! equ 1 set sName=%%j
						if !iCount! equ 2 set sAddress=%%j
					)
					>>"%sLog%" echo !sName! = !sAddress!
				)
			)
		) else (
			echo File with Names list [%sFileSource%] not found
		)
	) else (
		call :Usage
		exit /b 1
	)
) else (
	call :Usage
	exit /b 1
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:Usage
	echo Usage: %~nx0 ^<Names list^> ^<Log file^>
	exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
	setlocal enableextensions enabledelayedexpansion

:NextName
	set sTempName=%temp%\temp%random%.tmp

	if exist "%sTempName%" goto :NextName

	set sProcName=%~0

	endlocal & set %sProcName:~4%=%sTempName%
	exit /b 0
rem ==========================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:21, 10-10-2011 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Учусь PowerShell'у:
читать дальше »
Код: Выделить весь код
$sMachineList = "E:\Песочница\0084\1\pc.txt"
$sLog         = "E:\Песочница\0084\1\out.txt"

Clear-Content -Path $sLog -ErrorAction SilentlyContinue

Get-Content -Path $sMachineList |`
    ForEach-Object {
        $sHost = $_
        
        try {
            $aIPAddress = [System.Net.Dns]::GetHostAddresses($sHost)
            $OutLine = $sHost + " = " + $aIPAddress[0].IPAddressToString
        } catch {
            $OutLine = $sHost + " = (" + $_.Exception.InnerException.Message + ")"
        }
        
        Write-Host $OutLine
        
        Add-Content -Path $sLog -Value $OutLine
    }
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:22, 11-10-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] nslookup для парка ПК

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Скрипт копирования файла с парка компьтеров. exo Скриптовые языки администрирования Windows 4 14-09-2009 15:24
nslookup Aleksey Potapov Microsoft Windows NT/2000/2003 87 12-08-2008 18:44
Подбор - [решено] Легализация парка + покупка новых shilnik Лицензирование продуктов Microsoft 1 26-01-2008 13:36
Приобретение - лицензирование небольщого компьютерного парка Frose Лицензирование продуктов Microsoft 2 14-01-2008 08:34
Программа для учета парка ПК flatline Программное обеспечение Windows 5 10-03-2007 22:33




 
Переход