Войти

Показать полную графическую версию : [решено] сохранение параметра в config.cfg и потом чтоб его можно было применять в других бат


vlad_exe@vk
11-05-2012, 14:54
Мне необходимо параметры к bat для сохранения параметра в файл config.cfg и потом чтоб его можно было брать и применять в других бат файлах .
Например :
У бат файле имеется значение %rsd% .
У бат файле имеется значение %dtt% .
У бат файле имеется значение %rtt% .
их нужно сохранить в config.cfg который в той же папке .
и потом использовать в другом бат файле который тоже в этой папке .

Anonymоus
11-05-2012, 21:25
В начале батника размещаете строку
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 везде было одинаковым.

vlad_exe@vk
11-05-2012, 23:08
немного сложно но на примере было бы проще , но я всё же попробую разобраться ))) СПС

Anonymоus
12-05-2012, 06:15
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 ===============================

vlad_exe@vk
12-05-2012, 11:25
ОГРОМНОЕ СпС приблизительно понял )))

firstarey
14-05-2012, 11:26
еще 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 »
в которм будет содержаться:
имя параметра = значение параметра

NightFox
02-04-2016, 18:49
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. Если на конце комментария цифра, то этот комментарий на конце надо отбить пробелом, иначе комментарий пропадёт.




© OSzone.net 2001-2012