Войти

Показать полную графическую версию : [решено] Чтение/запись строк из конфигурационного файла в переменную


anonymous_prodject
30-07-2016, 11:30
Приветствую! Есть файл конфигураций для программы setting.xml, имеет следующий вид:

<?xml version="1.0" encoding="utf-16"?>
<UserSettingsXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AuthType>Google</AuthType>
<GoogleUsername>username</GoogleUsername>
<GooglePassword>password</GooglePassword>
<Filter>
<Name>Use</Name>
<Count>20</Count>
</Filter>
</UserSettingsXml>

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

for /f "UseBackQ Delims=" %%A IN ("setting.xml") do (
set /a c+=1
if !c!==4 set "a=%%A"
if !c!==5 set "b=%%A"
)

он не хочет читать, если не взять в кавычки переменную, например if !c!==4 set "a="%%A"", вот так работает, но он берет в кавычках всю строку, а нужен username между скобок.
А потом , измененный username запись обратно в файл.
Для очистки "лишнего" пробовал:

set sPath=
set sPartPath=
echo !sPath:%sPartPath%=!

но что-то вообще не работает
Заранее спасибо!

alpap
30-07-2016, 13:50
@echo off
setlocal enabledelayedexpansion
set "sf=<GoogleUsername>" &: Поиск строки "<GoogleUsername>username</GoogleUsername>"
set "sz=s_username" &: Здесь указать что вместо username
<"setting.xml">>$ (for /f "delims=" %%a in ('more') do echo "%%a"|>nul find/i "%sf%" && (
for /f "tokens=1-3 delims=>< " %%b in ("%%~a") do set "z=%%c"& echo: ^<%%b^>^<!z:%%c=%sz%!^>^<%%d^>
) || (
echo %%a
)
)
)
move $ "setting.xml"
exit
.

anonymous_prodject
30-07-2016, 15:40
. »
Спасибо, код работает, но на выходе я получаю:
<GoogleUsername><s_username></GoogleUsername>, а можно без <>, чисто s_username, т.к программа не прочитает код.
и можно раздельно операцию поиска и отдельно замены?
т.е 1) поиск в файле и внесение в переменную значения между ><
2) Ввод и замена в файле?
Спасибо.

alpap
30-07-2016, 16:03
Обе строки:

@echo off
setlocal enabledelayedexpansion
set "sf1=<GoogleUsername>" &: Поиск строки "<GoogleUsername>username</GoogleUsername>"
set "sf2=<GooglePassword>" &: Поиск строки "<GooglePassword>password</GooglePassword>"
set "sz1=s_username" &: Здесь указать что вместо username
set "sz2=s_password" &: Здесь указать что вместо password
<"setting.xml">>$ (for /f "delims=" %%a in ('more') do @(
echo "%%~a"|>nul find "%sf1%" && (
for /f "tokens=1-3 delims=>< " %%b in ("%%~a") do @set "z1=%%c"& echo: ^<%%b^>^<!z1:%%c=%sz1%!^>^<%%d^>
) || (
echo "%%~a"|>nul find "%sf2%" && for /f "tokens=1-3 delims=>< " %%b in ("%%~a") do @set "z2=%%c"& echo: ^<%%b^>^<!z2:%%c=%sz2%!^>^<%%d^>
) || (
echo %%a
)
)
)
move $ "setting.xml"
exit
.

Спасибо, код работает, но на выходе я получаю: »
шутить изволите!
На выходе вы получете

<?xml version="1.0" encoding="utf-16"?>
<UserSettingsXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AuthType>Google</AuthType>
<GoogleUsername><s_username></GoogleUsername>
<GooglePassword><password></GooglePassword>
<Filter>
<Name>Use</Name>
<Count>20</Count>
</Filter>
</UserSettingsXml>

с уже заданным вами в строке [set "sz=s_username"] нужным username
иначе для чего все это делается.
Или объясните толком какова конечная цель операции.

Если хотите взять в переменную середину строки [<GoogleUsername>username</GoogleUsername>]:

@echo off
<"setting.xml" (for /f "tokens=2 delims=>< " %%a in ('find "<GoogleUsername>"') do @echo %%a)
pause>nul

для другой строки поменяйте find "<GoogleUsername>" на find "<GooglePassword>"

А потом , измененный username запись обратно в файл. »
вроде не жалюсь ни на зрение ни на голову.

anonymous_prodject
30-07-2016, 17:12
Да не.. эт я написал все вместе вам, а так буду пихать в разные места в скрипте.
Конечная цель? Написать полноценный скрипт с меню и т.п, при выборе допустим одного пункта он будет искать в файле значения и записывать в переменные. В другом же пункте пользователь вводит значения и они записываются в файл. Да все вроде как знаю, но вот с таким первый раз столкнулся.

На выходе вы получете »
так я знаю, я не писал просто вам весь код, мне нужно без "<>" <s_username>, просто s_username, конечный код типа

<?xml version="1.0" encoding="utf-16"?>
<UserSettingsXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AuthType>Google</AuthType>
<GoogleUsername>s_username</GoogleUsername>
<GooglePassword>password</GooglePassword>
<Filter>
<Name>Use</Name>
<Count>20</Count>
</Filter>
</UserSettingsXml>

Iska
30-07-2016, 17:19
На выходе вы получете »
В коде лучше выделяйте тэгом «highlight» ([H] на панели), будет заметнее.

anonymous_prodject
30-07-2016, 17:46
Вот, неужели, сделал рабочий прототип. Спасибо.

@echo off
setlocal enabledelayedexpansion
<"setting.xml" (for /f "tokens=2 delims=>< " %%a in ('find "<GoogleUsername>"') do @echo %%a)
pause > nul

echo enter mail:
Set /p sz=

set "sf=<GoogleUsername>" &: Поиск строки "<GoogleUsername>username</GoogleUsername>"
<"setting.xml">>$ (for /f "delims=" %%a in ('more') do echo "%%a"|>nul find/i "%sf%" && (
for /f "tokens=1-3 delims=>< " %%b in ("%%~a") do set "z=%%c"& echo: ^<%%b^>!z:%%c=%sz%!^<%%d^>
) || (
echo %%a
)
)
)
move $ "setting.xml"

alpap
30-07-2016, 19:01
Написать полноценный скрипт с меню и т.п, при выборе допустим одного пункта он будет искать в файле значения и записывать в переменные. В другом же пункте пользователь вводит значения и они записываются в файл. »
Мне показалось что надо было похожее на это:

@echo off
echo Пункт 1.
echo Поиск значения "username" в строке с направлением его в переменную.
echo Пункт 2.
echo Замена значения "username" в файле.
set /p vp="Выберите номер пункта: "
if %vp%==1 call :p1
if %vp%==2 call :p2
exit

:p1
<"setting.xml" (for /f "tokens=2 delims=>< " %%a in ('find "<GoogleUsername>"') do @set "sz=%%a")
echo %sz%
pause& exit/b

:p2
setlocal enabledelayedexpansion
echo enter mail:
set /p sz=
set "sf=<GoogleUsername>" &: Поиск строки "<GoogleUsername>username</GoogleUsername>"
<"setting.xml">>$ (for /f "delims=" %%a in ('more') do echo "%%a"|>nul find/i "%sf%" && (
for /f "tokens=1-3 delims=>< " %%b in ("%%~a") do set "z=%%c"& echo: ^<%%b^>!z:%%c=%sz%!^<%%d^>
) || (
echo %%a
)
)
)
move $ "setting.xml"
exit/b
.




© OSzone.net 2001-2012