Компьютерный форум 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=227510)

Debugger 10-02-2012 14:19 1855575

Перебор свободных IP по списку и выбор свободного
 
Цель такая - имеется несколько свободных IP-адресов, которые используются не постоянно, а только на момент подготовки компьютеров к работе - установка ОС, софта, назначение уже постоянного другого IP адреса и выдача сотруднику. Сваял батник, который при первом входе в систему назначает компьютеру временный и заведомо никем не используемый IP-адрес, затем пингует остальные по списку и назначает уже другой - свободный (DHCP отключен). После чего установка софта запускается уже по сетке. Батник получился довольно громоздким, все думаю как бы его уменьшить (просто из спортивного интереса), или может быть можно сделать вообще как-то по-другому? И хочу чтобы был только один файл.
Код:

reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v SearchList /t REG_SZ /d zavod.loc /f
reg add HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters /v SearchList /t REG_SZ /d zavod.loc /f
echo pushd interface ip > c:\ipconfig
echo set address name="Подключение по локальной сети" source=static addr=192.168.9.192 mask=255.255.252.0 >> c:\ipconfig
echo set address name="Подключение по локальной сети" gateway=192.168.10.199 gwmetric=0 >> c:\ipconfig
echo set dns name="Подключение по локальной сети" source=static addr=192.168.10.5 register=PRIMARY >> c:\ipconfig
echo add dns name="Подключение по локальной сети" addr=192.168.10.171 index=2 >> c:\ipconfig
echo set wins name="Подключение по локальной сети" source=static addr=none >> c:\ipconfig
echo popd >> c:\ipconfig
netsh exec c:\ipconfig
del /q c:\ipconfig

for %%I in (245,246,247,248) do ping 192.168.9.%%I -n 3 | find /I "TTL" || (set freeIP=%%I & goto :setip)
echo "Нет свободных адресов" & pause & exit

:setip
echo pushd interface ip > c:\ipconfig
echo set address name="Подключение по локальной сети" source=static addr=192.168.9.%freeIP% mask=255.255.252.0 >> c:\ipconfig
echo set address name="Подключение по локальной сети" gateway=192.168.10.199 gwmetric=0 >> c:\ipconfig
echo set dns name="Подключение по локальной сети" source=static addr=192.168.10.5 register=PRIMARY >> c:\ipconfig
echo add dns name="Подключение по локальной сети" addr=192.168.10.171 index=2 >> c:\ipconfig
echo set wins name="Подключение по локальной сети" source=static addr=none >> c:\ipconfig
echo popd >> c:\ipconfig
netsh exec c:\ipconfig
del /q c:\ipconfig


Busla 11-02-2012 11:39 1856115

Именно для этого и придумывали DHCP - почему же его не использовать в своей лабораторной сети?

Debugger 11-02-2012 12:47 1856165

Нет возможности включить DHCP - сеть общая, заводская.

Iska 11-02-2012 13:32 1856201

Цитата:

Цитата Debugger
Батник получился довольно громоздким, все думаю как бы его уменьшить (просто из спортивного интереса) »

1. В общем и целом — имеет смысл для повторяющегося текста использовать переменные. Скажем, у Вас многократно идёт текст «Подключение по локальной сети», идентифицирующий подключение. Может быть, стоит даже захватить чуть больше — вместе с «name=…».

Т.е., что-то наподобие:
Код:

set sName=name="Подключение по локальной сети"

echo set address %sName% source=static addr=192.168.9.192 mask=255.255.252.0 >> c:\ipconfig
echo set address %sName% gateway=192.168.10.199 gwmetric=0 >> c:\ipconfig
echo set dns %sName% source=static addr=192.168.10.5 register=PRIMARY >> c:\ipconfig

То же относится и к имени файла, куда мы выводим — лучше его один раз определить через переменную, затем использовать эту переменную в коде (см. также п.2).

2. Чтобы не писать в каждой команде перенаправление вывода — можно оформить их операторными скобками, за/перед которыми уже и использовать перенаправление. Наподобие:
Код:

set sFileOut=c:\ipconfig.txt
set sName=name="Подключение по локальной сети"


>"%sFileOut%" (
        echo pushd interface ip
        echo set address %sName% source=static addr=192.168.9.192 mask=255.255.252.0
        echo set address %sName% gateway=192.168.10.199 gwmetric=0
        echo set dns    %sName% source=static addr=192.168.10.5 register=PRIMARY
        echo add dns    %sName% addr=192.168.10.171 index=2
        echo set wins    %sName% source=static addr=none
        echo popd
)
netsh exec "%sFileOut%"
del /q "%sFileOut%"


Как Вы поняли — это всё «косметика».

Debugger 11-02-2012 17:42 1856385

Цитата:

Цитата Iska
В общем и целом — имеет смысл для повторяющегося текста использовать переменные. »

Вот это - да, непростительно. Надо было догадаться.
Цитата:

Цитата Iska
Как Вы поняли — это всё «косметика». »

Вот именно "косметику" я и имел в виду, спасибо за предложения. Про конструкцию
Код:

>"%sFileOut%" (
        echo pushd interface ip
        echo set address %sName% source=static addr=192.168.9.192 mask=255.255.252.0
        echo set address %sName% gateway=192.168.10.199 gwmetric=0
        echo set dns    %sName% source=static addr=192.168.10.5 register=PRIMARY
        echo add dns    %sName% addr=192.168.10.171 index=2
        echo set wins    %sName% source=static addr=none
        echo popd)

- я вообще не знал, что такое допускается в батниках. Тему отмечаю решенной.


Время: 07:13.

Время: 07:13.
© OSzone.net 2001-