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

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

Abricosio 29-01-2012 00:15 1846647

Сохранение параметра в файл и обратное действие
 
Добрый вечер!
Есть вопрос, буду благодарен за любую помощь.
Есть программа по смене MAC адреса, называется MacShift
mac адрес меняется на произвольный (random) через bat файл такого содержания:
start c:/macshift/macshift.exe -i "LocalNet" -r
где LocalNet - соответственно название сети, и -r - параметр произвольной смены МАКа
Возможно ли дописать данный бат файл, чтобы он сохранял каждый раз строчку такого содержания:
mac=xxxxxxxxxxxx (соответственно измененный мак адрес)
в файл c:/mac.txt

И второй вопрос, обратный к первому
Какой скрипт нужно написать, чтобы он(скрипт) брал строчку из файла c:/mac.txt содержания
mac=xxxxxxxxxxxx
и xxxxxxxxxxxx вставлял в скрипт как
start c:/macshift/macshift.exe -i "LocalNet" -xxxxxxxxxxxx

Спасибо ОГРОМНОЕ заранее!

XXXp 30-01-2012 01:00 1847308

Как сделать не знаю, но предполагаю, что МАК можно после смены много откуда брать и сохранять

Abricosio 30-01-2012 18:50 1847783

Более понятно описал необходимый скрипт!
За помощь в создании компенсирую финансами потраченное время (чтобы и вам было не накладно)

Имеется программа macshift (по запросу могу выслать конечно)
Смена произвольного Mac адреса в ней осуществляется через бат файл с содержанием:
start c:/macshift/macshift.exe -i "LocalNet" -r
где LocalNet - название локальной сети -r - проивольное изменение МАК адреса
Соответственно, команда
start c:/macshift/macshift.exe -i "LocalNet" -xxxxxxxxxxxx
Меняет МАК на -xxxxxxxxxxxx
Ну и, соответственно:
Необходимо сделать следующий bat файл:
Загружается c:/config.ini в нём находится строчка mac=
Если строчка ПУСТАЯ, т.е. после = ничего нет (или вообще строчки нет, если так проще)
То осуществляет команду start c:/macshift/macshift.exe -i "LocalNet" -r (произвольно меняем мак)
и сохраняем получившийся mac в файл c:/config.ini в виде mac=новый мак (без тире и двоеточия)
Если строчка НЕ ПУСТАЯ, т.е. mac=zzzzzzzzzzzz
То осуществляем команду start c:/macshift/macshift.exe -i "LocalNet" -zzzzzzzzzzzz

Abricosio 31-01-2012 22:29 1848839

Неужели это нельзя реализовать?
Напоминаю, что постараюсь компенсировать потраченное время на создание скрипта

root221 01-02-2012 01:37 1848961

О боже как всё сложно.

честно говоря, я ничего не понял((

root221 01-02-2012 02:16 1848982

свой macshift который будет использоваться тобой, скинь в тему, что бы быстрей тебе помогли.

Abricosio 01-02-2012 16:06 1849374

Вложений: 1
Вот он!

Abricosio 01-02-2012 17:09 1849414

У нас есть файл config.ini (его содержимое будет меняться естественно), изначально в нём нет строчки mac=xxx, т.е. он используется впервые для macshift
В этом случае (если нет mac=)
Нам нужно выполнить команду start c:/macshift/macshift.exe -i "LocalNet" -r
и записать в этот файл (config.ini) значение нового mac адреса в виде mac=новый мак адрес
Если в файле config.ini уже присутствует строчка mac=zzz
необходимо выполнить команду start c:/macshift/macshift.exe -i "LocalNet" -zzz
и ничего больше никуда не записывать.

Либо другой вариант того же, только гораздо более простой (для меня в том числе)
Имеем два скрипта:
Один записывает случайный mac в каждый из нескольких десятков-сотен файлов c:/configs/*.ini строчкой в виде mac=xxxxxxxxxxxx, причём запись случайного мака необходимо произвести по всем правилам, используемым в macshift (грубо команда -r для проги)
Второй скрипт просто бы брал из файла c:/config.ini строчку mac=zzzzzzzzzzzz и запускал бы команду
start c:/macshift/macshift.exe -i "LocalNet" -zzzzzzzzzzzz

Anonymоus 02-02-2012 17:54 1850219

Abricosio, вот вам скрипт, программа macshift должна лежать в одной директории с ним (или в любом месте, которое прописано в PATH), местоположение ini-файла для записи укажете сами. Если его не существует по указанному пути, он создается.



Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Проверяем, существует ли файл, и есть ли в нем нужный нам ключ (mac)
Set CfgFile=config.ini

If Not Exist "%CfgFile%" Echo mac=>"%CfgFile%"
type "%CfgFile%"|Find /I "mac=">nul||Echo mac=>>"%CfgFile%"
:: Проверяем ini-файл на наличие значения mac
Call :ReadKeyValue
If Defined mac (
Echo MAC найден: [%mac%]
:: Если найдено - запускаем macshift со значением из файла
call macshift -i "LocalNet" %Mac%>nul
) Else (
:: Если не найдено - запускаем с ключом -r, парсим вывод и сохраняем новый mac в файл
For /F "tokens=7 skip=1" %%A In ('macshift -i "LocalNet" -r^|find "MAC"') Do (
Set mac=%%A
Set mac=!mac:~,-3!
)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Pause
Exit




rem ====== Функции для работы с ini
:ReadKeyValue
If Not Exist %CfgFile% (Exit 1)
Set i=0
For /F "tokens=1,2 delims== usebackq" %%A In ("%CfgFile%") Do (
        Set /A i+=1
        Set %%A=%%B
        Set CfgKey!i!=%%A
        Set CfgStrings=!i!
)
Exit /B

:WriteKeyValue
If Exist "%CfgFile%" (Del "%CfgFile%")
For /L %%S In (1,1,%CfgStrings%) Do (
        Call :SingleLine "!CfgKey%%S!"
)
Exit /B
:SingleLine
Echo %~1=!%~1!>>"%CfgFile%"
Exit /B
rem ===============================

Да, вот ещё: я саму программу macshift не стал запускать у себя, скрипт набросал без отладки, так что вы проверьте - всё ли правильно работает?

root221 02-02-2012 18:06 1850227

Думаю не совсем всё как надо... По моему надо обратное действие ещё...
что бы мак в дальнейшем брался из конфига, если он там есть то уже выполнять команду

Код:

mac=Тут значение уже вместо -r
Цитата:

Цитата Abricosio
Второй скрипт просто бы брал из файла c:/config.ini строчку mac=zzzzzzzzzzzz и запускал бы команду
start c:/macshift/macshift.exe -i "LocalNet" -zzzzzzzzzzzz »


Anonymоus 02-02-2012 18:15 1850234

Цитата:

Цитата root221
По моему надо обратное действие ещё »

root221, посмотрите внимательнее на мой скрипт. Там все сделано именно так, как описано в первом посте. Обьясню логику его работы поподробнее:
Перво-наперво, проверяем, есть ли вообще файл, заданный как конфигурационный. Если нету - создаем. Если внутри него нету ключа mac - дописываем пустое. Далее, считываем key-value значения из него с помощью функции :ReadKeyValue, при этом создаются переменные с нужными значениями. После проверяем, определена ли переменная mac - если определена, то запускаем macshift с этим mac-адресом. Если не определена - запускаем macshift, но с ключом -r, он устанавливает случайный мак-адрес, выбираем его знаачение из stdout с помощью конвеера и find, назначаем новое значение переменной mac и записываем в файл с помощью функции :WriteKeyValue

root221 02-02-2012 18:44 1850250

всё понял почему не работал) Потому что автор не правильно написал... МАК вызывается

Код:

не так

-zzzzzzzzz

а вот так

zzzzzzzz


Автору)

Что бы не запустался

Код:

это
call macshift -i "LocalNet" -%Mac%

заменить надо на

call macshift -i "LocalNet" %Mac%


Anonymоus 02-02-2012 19:11 1850267

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

Abricosio 03-02-2012 00:11 1850476

Вроде все работает! Спасибо! Как только отключить диалог "нажмите кнопку для продолжения"?
И пришлите пожалуйста в личку вариант перевода Вам моей благодарности :)

root221 03-02-2012 06:30 1850576

Код:

)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Pause
Exit


Замени на

Код:

)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Exit


Abricosio 03-02-2012 12:45 1850803

2Anonymоus
Спасибо большое, через личные сообщения не получается писать, говорит что у вас переполнен ящик)

Anonymоus 03-02-2012 12:48 1850806

Да, так и есть, только что почистил. В последнее время часто пишут. Вам тоже спасибо, если понадобится помощь со скриптами - обращайтесь, помогу по мере возможностей.

Abricosio 14-02-2012 01:57 1858170

Вылезла маленькая неувязочка в скрипте, он добавляет знак равенства "="
ко всем параметрам в файле ini в квадратных скобках, т.е.
было [blabla]
стало после работы скрипта
[blabla]=
из-за чего теперь не работает другая часть конфига. Не подскажите как решить данную проблему?) Спасибо

Anonymоus 14-02-2012 03:07 1858209

Abricosio, поправил, теперь больше такого не будет. Вы просто не уточнили с самого начала, что в конфиге могут быть секции ini.

Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Проверяем, существует ли файл, и есть ли в нем нужный нам ключ (mac)
Set CfgFile=config.ini

If Not Exist "%CfgFile%" Echo mac=>"%CfgFile%"
type "%CfgFile%"|Find /I "mac=">nul||Echo mac=>>"%CfgFile%"
:: Проверяем ini-файл на наличие значения mac
Call :ReadKeyValue
If Defined mac (
Echo MAC найден: [%mac%]
:: Если найдено - запускаем macshift со значением из файла
call macshift -i "LocalNet" %Mac%>nul
) Else (
:: Если не найдено - запускаем с ключом -r, парсим вывод и сохраняем новый mac в файл
For /F "tokens=7 skip=1" %%A In ('macshift -i "LocalNet" -r^|find "MAC"') Do (
Set mac=%%A
Set mac=!mac:~,-3!
)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Exit




rem ====== Функции для работы с ini
:ReadKeyValue
If Not Exist %CfgFile% (Exit 1)
Set i=0
For /F "tokens=1,2 delims== usebackq" %%A In ("%CfgFile%") Do (
        Set /A i+=1
        Set %%A=%%B
        Set CfgKey!i!=%%A
        Set CfgStrings=!i!
)
Exit /B

:WriteKeyValue
If Exist "%CfgFile%" (Del "%CfgFile%")
For /L %%S In (1,1,%CfgStrings%) Do (
        Call :SingleLine "!CfgKey%%S!"
)
Exit /B
:SingleLine
If "%~1"=="" Exit /B
If Not "!%~1!"=="" (Echo %~1=!%~1!>>"%CfgFile%") Else (Echo %~1>>"%CfgFile%")
Exit /B
rem ===============================


Abricosio 14-02-2012 16:27 1858619

Спасибо большое!

Abricosio 18-03-2012 01:11 1881547

Подскажите пожалуйста интересный момент выяснился, при записи МАКа программа режет предыдущий параметр, который содержит ссылку, как я понимаю из-за знака =
т.е. было <a href=ссылка и т.д. >, а стало заканчиваться просто <a href и обрываться
С чем это может быть связано и как вылечить? Заранее СПАСИБО! )

Abricosio 21-03-2012 14:31 1883926

Все ещё крайне актуально.. Помогите пожалуйста..


Время: 14:03.

Время: 14:03.
© OSzone.net 2001-