2013-03-14 1 views
0

У меня есть конфигурационный файл с именем config.conf с содержанием:Редактирование внешнего значения пакетной конфигурации с партией

[Config] 
password=1234 
usertries=0 
allowterminate=0 

Я хочу просто изменить значение usertries 5, есть ли код пакетного сценария, который может помочь мне сделать это

Благодаря

+0

Какие языки сценариев вы готовы использовать? –

ответ

1

Это становится немного грязный, но должно работать:

@echo off 
set ConfigFile=config.conf 
setlocal enabledelayedexpansion 
(for /f "delims=" %%L in (%ConfigFile%) do (
    set "LINE=%%L" 
    if "!LINE:~0,10!"=="usertries=" (echo usertries=5) else (echo !LINE!) 
)) > %ConfigFile%.new 
move /y %ConfigFile%.new %ConfigFile% > nul 

В основном мы записываем каждую строку в новый файл, если только она не начинается с usertries=. В этом случае мы просто вставляем нашу линию замены. Затем мы переносим новый файл поверх старого, чтобы заменить его.

+0

Моя конфигурация находится в папке с именем test, поэтому я должен правильно установить ConfigFile = test/config.conf? –

+0

Также я могу знать, что эта строка делает набор «LINE = %% L», потому что я может изменить номер строки для usertries –

+0

Это не работает, вот мой код набор ConfigFile = тест/config.conf SETLOCAL enabledelayedexpansion (for/f %% L in (% ConfigFile%) do ( set "LINE = %% L" if "! LINE: ~ 0,10!" == "usertries =" (echo usertries = 0) else (эхо ! LINE!) ))>% ConfigFile% .new move/y% ConfigFile% .new% ConfigFile%> nul –

0
@ECHO OFF 
setlocal 
:: 
:: set %1 to value %2 in config.conf 
:: 
SET target=%2&IF NOT DEFINED target ECHO syntax is %0 keyname newvalue&GOTO :EOF 
SET target=Config.conf 
MOVE /y %target% %target%.old >NUL 
FOR /f "tokens=1*delims==" %%i IN (%target%.old) DO (
IF /i %%i==%1 (ECHO %%i=%2) ELSE (
IF "%%j"=="" (ECHO %%i) ELSE (ECHO %%i=%%j) 
) 
) >>%target% 

С помощью этой версии, вы можете изменить существующий ключ к стоимости с использованием

thisbatchname existingkey newvalue 
0

Я знаю, что я немного опоздали на вечеринку, но я решил написать общее назначение INI-файл утилита пакетного сценария для решения этого вопроса.

Сценарий позволит вам восстановить или изменить значения в файле ini-стиля. Его поиск не зависит от регистра, и он сохраняет пустые строки в ini-файле. По сути, он позволяет вам взаимодействовать с ini-файлом как своего рода очень рудиментарную базу данных.

:: -------------------- 
:: ini.bat 
:: ini.bat /? for usage 
:: -------------------- 

@echo off 
setlocal enabledelayedexpansion 

goto begin 

:usage 
echo Usage: %~nx0 /i item [/v value] [/s section] inifile 
echo; 
echo Take the following ini file for example: 
echo; 
echo [Config] 
echo password=1234 
echo usertries=0 
echo allowterminate=0 
echo; 
echo To read the "password" value: 
echo %~nx0 /s Config /i password inifile 
echo; 
echo To change the "usertries" value to 5: 
echo %~nx0 /s Config /i usertries /v 5 inifile 
echo; 
echo In the above examples, "/s Config" is optional, but will allow the selection of 
echo a specific item where the ini file contains similar items in multiple sections. 
goto :EOF 

:begin 
if "%~1"=="" goto usage 
for %%I in (item value section found) do set %%I= 
for %%I in (%*) do (
    if defined next (
     if !next!==/i set item=%%I 
     if !next!==/v set value=%%I 
     if !next!==/s set section=%%I 
     set next= 
    ) else (
     for %%x in (/i /v /s) do if "%%~I"=="%%x" set "next=%%~I" 
     if not defined next (
      set "arg=%%~I" 
      if "!arg:~0,1!"=="/" (
       1>&2 echo Error: Unrecognized option "%%~I" 
       1>&2 echo; 
       1>&2 call :usage 
       exit /b 1 
      ) else set "inifile=%%~I" 
     ) 
    ) 
) 
for %%I in (item inifile) do if not defined %%I goto usage 
if not exist "%inifile%" (
    1>&2 echo Error: %inifile% not found. 
    exit /b 1 
) 

if not defined section (
    if not defined value (
     for /f "usebackq tokens=2 delims==" %%I in (`findstr /i "^%item%\=" "%inifile%"`) do (
      echo(%%I 
     ) 
    ) else (
     for /f "usebackq delims=" %%I in (`findstr /n "^" "%inifile%"`) do (
      set "line=%%I" && set "line=!line:*:=!" 
      echo(!line! | findstr /i "^%item%\=" >NUL && (
       1>>"%inifile%.1" echo(%item%=%value% 
       echo(%value% 
      ) || 1>>"%inifile%.1" echo(!line! 
     ) 
    ) 
) else (
    for /f "usebackq delims=" %%I in (`findstr /n "^" "%inifile%"`) do (
     set "line=%%I" && set "line=!line:*:=!" 
     if defined found (
      if defined value (
       echo(!line! | findstr /i "^%item%\=" >NUL && (
        1>>"%inifile%.1" echo(%item%=%value% 
        echo(%value% 
        set found= 
       ) || 1>>"%inifile%.1" echo(!line! 
      ) else echo(!line! | findstr /i "^%item%\=" >NUL && (
       for /f "tokens=2 delims==" %%x in ("!line!") do (
        echo(%%x 
        exit /b 0 
       ) 
      ) 
     ) else (
      if defined value (1>>"%inifile%.1" echo(!line!) 
      echo(!line! | find /i "[%section%]" >NUL && set found=1 
     ) 
    ) 
) 

if exist "%inifile%.1" move /y "%inifile%.1" "%inifile%">NUL 

Пример:

C:\Users\me\Desktop>type config.conf 
[Config] 
password=1234 
usertries=0 
allowterminate=0 

[Other] 
password=foo 

C:\Users\me\Desktop>ini /i usertries /v 5 config.conf 
5 

C:\Users\me\Desktop>ini /i usertries config.conf 
5 

C:\Users\me\Desktop>ini /s config /i password /v bar config.conf 
bar 

C:\Users\me\Desktop>ini /s other /i password /v baz config.conf 
baz 

C:\Users\me\Desktop>type config.conf 
[Config] 
password=bar 
usertries=5 
allowterminate=0 

[Other] 
password=baz