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

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

Ответить
Настройки темы
CMD/BAT - [решено] сохранение параметра в config.cfg и потом чтоб его можно было применять в других бат

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


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

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


Мне необходимо параметры к bat для сохранения параметра в файл config.cfg и потом чтоб его можно было брать и применять в других бат файлах .
Например :
У бат файле имеется значение %rsd% .
У бат файле имеется значение %dtt% .
У бат файле имеется значение %rtt% .
их нужно сохранить в config.cfg который в той же папке .
и потом использовать в другом бат файле который тоже в этой папке .

Отправлено: 14:54, 11-05-2012

 

Старожил


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

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


В начале батника размещаете строку
SetLocal EnableDelayedExpansion
Далее, указываете файл настроек
Set CfgFile=test.cfg
Создаете сам файл настроек и вписываете в него нужные значения, в формате переменная=значение, такой формат еще называют key-value. К примеру, это будет
rsd=qwe
dtt=rty
rtt=zxc123

Далее, в конце батника размещаете этот код - функции для чтения и записи. Вызываются без аргументов.

Код: Выделить весь код
rem ====== Функции для работы с ini
rem v2, сохраняет комментарии и строки, не являющиеся парой key=value
rem Anonymous, 2011
: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 Not "!%~1!"=="" (Echo %~1=!%~1!>>"%CfgFile%") Else (Echo %~1>>"%CfgFile%")
Exit /B
rem ===============================
Далее, в удобном месте размещаете вызов функции чтения файла:
Call :ReadKeyValue
Всё, все переменные, записанные в файл прочитаны. Можно изменить их как угодно, например
Set rtt=0000
и записать изменения в файл вызовом
Call :WriteKeyValue
Если нужно использовать в других батниках - проследите, чтобы значение переменной CfgFile везде было одинаковым.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:25, 11-05-2012 | #2



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

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


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


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

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


немного сложно но на примере было бы проще , но я всё же попробую разобраться ))) СПС

Отправлено: 23:08, 11-05-2012 | #3


Старожил


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

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


vlad_exe@vk, вот пример, у которого каждая строчка прокомментирована. Так разберетёсь?

Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

:: Назначаем файл настроек
Set CfgFile=config.cfg

:: Проверяем - есть ли файл настроек
If Not Exist "%CfgFile%" (
rem Если нету - создаем. Вот такой немного необычный метод перенаправления
rem лучше применять, если создается файл в несколько строк.
rem Значения переменных в файле - пустые, их потом установим внутри скрипта.
rem Сюда обязательно стоит внести ВСЕ переменные, подлежащие сохранению.
rem Обращу внимание на то, что внутри этой конструкции комментарии лучше
rem писать с rem, это единственно верный способ, чтобы не вызвать ошибки.
	>"%CfgFile%" (
		Echo # This is a comment.
		Echo Peremennaya1=
		Echo Peremennaya2=
		Echo Peremennaya3=
		Echo Peremennaya4=
		Echo # End of test cfg-file
	)
)

:: Читаем то, что сохранено у нас в файле. Если он только что создан, то и
:: переменные в нем будут пустыми
Call :ReadKeyValue

:: Выводим в консоль значения, прочитанные из файла
Echo.
Echo    OLD:
Echo Peremennaya1=%Peremennaya1%
Echo Peremennaya2=%Peremennaya2%
Echo Peremennaya3=%Peremennaya3%
Echo Peremennaya4=%Peremennaya4%
Echo.

:: Заполняем переменные случайными значениями - для демонстрации того,
:: что в файл запишутся именно эти значения. В реальном скрипте, не примере -
:: эти значения меняются сами, во время работы скрипта, у нужных переменных.
Set Peremennaya1=%Random%%Random%
Set Peremennaya2=%Random%%Random%
Set Peremennaya3=%Random%%Random%
Set Peremennaya4=%Random%%Random%

:: Ещё раз выводим, чтобы показать - значения сменились, они не те, что при старте.
Echo    NEW:
Echo Peremennaya1=%Peremennaya1%
Echo Peremennaya2=%Peremennaya2%
Echo Peremennaya3=%Peremennaya3%
Echo Peremennaya4=%Peremennaya4%
Echo.

:: Наконец, пишем изменения в файл. Вот так просто, вызовом одной функции.
Call :WriteKeyValue

:: Выходим после нажатия любой кнопки. Теперь можно запустить скрипт ещё раз
:: и посмотреть на то, как при старте прочитаются значения из файла, а потом
:: запишутся новые.
:: Ещё конечно же, можно открыть файл настроек блокнотом и посмотреть на то,
:: что у него внутри.
Pause&Exit




rem ====== Функции для работы с ini
rem v2, сохраняет комментарии и строки, не являющиеся парой key=value
rem Anonymous, 2011
: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 Not "!%~1!"=="" (Echo %~1=!%~1!>>"%CfgFile%") Else (Echo %~1>>"%CfgFile%")
Exit /B
rem ===============================
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:15, 12-05-2012 | #4


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


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

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


ОГРОМНОЕ СпС приблизительно понял )))

Отправлено: 11:25, 12-05-2012 | #5


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


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

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


еще 1 вариант решения - возможно в вашем случае окажется проще:

в самом батнике добавляем строку в начале

Код: Выделить весь код
rem  считываем переменные из файла
For /F "eol=# tokens=1* delims==" %%i In (C:\Programs\Scripts_BAT\parametrs.txt) Do Set %%i=%%j
где C:\Programs\Scripts_BAT\parametrs.txt путь к вашему файлу с параметрами

ну и конечно сам файл с параметрами, как и писал Anonymоus
Цитата Anonymоus:
Anonymоus »
в которм будет содержаться:
имя параметра = значение параметра

Отправлено: 11:26, 14-05-2012 | #6


Новый участник


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

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


Anonymоus, ваш батник хорош, но у него есть проблемы, я решил их так:
Код: Выделить весь код
%~d0
cd /d %~dp0
:: тут всякий код
set CfgFile=%appname%.cfg

:: читаем и пишем

: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
rem исправляем проблему с двоеточием в комментарии, которое нарушает условие
set if=%~1
set if=%if::=%
rem убираем кавычки
for /f "delims=" %%A in ('echo %%%1%%') do set %1=%%~A
if "!%if%!"=="" (
rem goto нужно в условиях между скобками иначе будет ошибка непредвиденного появления !# (ему не нравится завершающая скобка если строка не в кавычках)
goto WriteComment
) else (
goto WriteParameters
)
exit /B
:WriteComment
echo %~1>>%CfgFile%
exit /B
:WriteParameters
echo %~1=!%~1!>>%CfgFile%
exit /B
Решённые проблемы:
1. ошибка двоеточия в комментарии;
2. ошибка закрывающей скобки на конце комментария.
Не решено, но обходится:
1. Если на конце комментария цифра, то этот комментарий на конце надо отбить пробелом, иначе комментарий пропадёт.

Отправлено: 18:49, 02-04-2016 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Сохранение параметра в файл и обратное действие Abricosio Скриптовые языки администрирования Windows 21 21-03-2012 14:31
.NET - Как отобр-ть результат ф-ции (Exp/F-E),чтоб потом производить вычисления? Ksenya Программирование и базы данных 2 17-12-2011 17:29
7 / 2008 R2 - Надо поставить win 7 на диск С, при этом чтоб не было других ОС Rindo Microsoft Windows 7 13 02-11-2009 10:13
Разное - Как открыть базу тестов, чтоб можно было распечатать Rustem Хочу все знать 2 13-02-2009 15:48
Что зделать чтоб можно было пистаь по руски в xterm nagel Общий по FreeBSD 8 13-05-2004 11:16




 
Переход