Компьютерный форум 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=317321)

anonymous_prodject 30-07-2016 11:30 2655492

Чтение/запись строк из конфигурационного файла в переменную
 
Приветствую! Есть файл конфигураций для программы 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 2655507

Код:

@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 2655520

Цитата:

Цитата alpap
. »

Спасибо, код работает, но на выходе я получаю:
Код:

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

alpap 30-07-2016 16:03 2655521

Обе строки:
Код:

@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

.

Цитата:

Цитата anonymous_prodject
Спасибо, код работает, но на выходе я получаю: »

шутить изволите!
На выходе вы получете
Код:

<?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>"

Цитата:

Цитата anonymous_prodject
А потом , измененный username запись обратно в файл. »

вроде не жалюсь ни на зрение ни на голову.

anonymous_prodject 30-07-2016 17:12 2655532

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

Цитата:

Цитата alpap
На выходе вы получете »

так я знаю, я не писал просто вам весь код, мне нужно без "<>" <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 2655538

Цитата:

Цитата alpap
На выходе вы получете »

В коде лучше выделяйте тэгом «highlight» ([H] на панели), будет заметнее.

anonymous_prodject 30-07-2016 17:46 2655540

Вот, неужели, сделал рабочий прототип. Спасибо.
Код:

@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 2655557

Цитата:

Цитата anonymous_prodject
Написать полноценный скрипт с меню и т.п, при выборе допустим одного пункта он будет искать в файле значения и записывать в переменные. В другом же пункте пользователь вводит значения и они записываются в файл. »

Мне показалось что надо было похожее на это:
Код:

@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

.


Время: 13:58.

Время: 13:58.
© OSzone.net 2001-