Войти

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


unkilledfore
04-06-2013, 11:56
Искал похожие решения, не получилось. Со скриптовыми языками не знаком.

step1. По пути C:\Documents and Settings\имя пользователя\Application Data\.myfolder находятся несколько xml-файлов. //Пользователей может быть много, имя заранее не известно
в одном из них settings.xml много строк вида

<pref name="savedstatus">
<pref name="default" type="int" value="1354262942" />
<pref name="startup" type="int" value="0" />
<pref name="startup_current_status" type="bool" value="1" />
<pref name="idleaway" type="int" value="1354193083" />
<pref name="isidleaway" type="bool" value="0" />
</pref>


step2. Выделенное значение динамическое (числовое), может меняться. Это значение надо найти в другом файле в этой же папке stat.xml и установить там значения offline в online. Если там уже стоит online, оставить как есть.

<status name="Auto-Cached" transient="true" created="1354262942" lastused="1354262942" usage_count="1">
<state>offline</state>
<substatus>
<state>offline</state>
</substatus>
</status>

Georgio
04-06-2013, 15:22
unkilledfore, попробуйте этот BAT-файл:

@ECHO OFF
SET SettingsFile=%APPDATA%\.myfolder\settings.xml
SET StatusFile=%APPDATA%\.myfolder\stat.xml
FOR /F "tokens=7 delims== " %%I IN ('FINDSTR default "%SettingsFile%"') DO (
SET Value=%%~I
)
SETLOCAL ENABLEDELAYEDEXPANSION>status_new.xml
FOR /F "tokens=4" %%I IN ('FINDSTR %Value% "%StatusFile%"') DO (
IF %%I==created="%Value%" (
FOR /F "usebackq tokens=*" %%J IN ("%StatusFile%") DO (
SET "VAR1=%%J"
SET /P "VAR2=!VAR1:offline=online!" 0>nul 1>>stat_new.xml
ECHO.>>stat_new.xml
)
TYPE stat_new.xml>"%StatusFile%"
))
DEL stat_new.xml

unkilledfore
05-06-2013, 09:21
Спасибо большое. Можно уточнить?
FOR /F "tokens=7 delims== " %%I IN ('FINDSTR default "%SettingsFile%"') »
эта команда ищет первое попавшееся слово default? или находит все? в первом файле есть несколько параметров, содержащих слово default. То, которое нужно - первое.

Georgio
05-06-2013, 09:52
эта команда ищет первое попавшееся слово default? или находит все? в первом файле есть несколько параметров, содержащих слово default. То, которое нужно - первое. »

Команда FINDSTR ищет все строки со словом "default", но в цикле они обрабатываются так, чтобы в найденных строках вычленить числовое значение Value.

unkilledfore
05-06-2013, 10:28
чтобы в найденных строках вычленить числовое значение Value »
Такие строки он тоже обработает?
<pref name="theme" type="string" value="Default" />
......
<pref name="pounce_default" type="bool" value="1" />
.....
<pref name="default_actions">
<pref name="open-window" type="bool" value="0" />

Georgio
05-06-2013, 18:56
<pref name="pounce_default" type="bool" value="1" /> » -- эта строка может "представлять опасность" для общества выполнения скрипта.


С учётом "новых открывшихся обстоятельств" дело будет пересмотрено переделываю скрипт:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION>stat_new.xml
SET SettingsFile=%APPDATA%\.myfolder\settings.xml
SET StatusFile=%APPDATA%\.myfolder\stat.xml
FOR /F "tokens=7 delims== " %%I IN ('FINDSTR default "%SettingsFile%"') DO (
FOR /F "tokens=4" %%J IN ('FINDSTR %%~I "%StatusFile%"') DO (
IF %%J==created=%%I (
FOR /F "usebackq tokens=*" %%K IN ("%StatusFile%") DO (
SET "VAR1=%%K"
SET /P "VAR2=!VAR1:offline=online!" 0>nul 1>>stat_new.xml
ECHO.>>stat_new.xml
)
TYPE stat_new.xml>"%StatusFile%"
)))
DEL stat_new.xml


Больше "подводных камней" не будет?

unkilledfore
06-06-2013, 09:39
Больше "подводных камней" не будет? »
Скрипт чистит файл stat.xml

FOR /F "tokens=7 delims== " %%I IN ('FINDSTR default "%SettingsFile%"') »
cmd говорит "Непредвиденное появление %%I
для всех трех FOR пишет про непредвиденное появление переменной %%I %%J %%K :(

Georgio
06-06-2013, 10:08
unkilledfore, выложите полностью содержание файлов settings.xml и stat.xml или прикрепите эти файлы к странице как вложения.

Iska
06-06-2013, 11:18
Лучше именно вложениями, упаковав в архив — из-за кодировки.

unkilledfore
06-06-2013, 11:48
Вот

Georgio
07-06-2013, 03:12
1. В выложенных XML-файлах все значения оказались не в двойных кавычках, как приводится в условиях задачи, а в одинарных, что, "мягко выражаясь", наводит на мысль об использовании в циклах во избежание всяческих недоразумений (снова "мягко выражаясь") другой семантики (ключ "usebackq" и обратные одинарные кавычки).

2. В отличие от условий задачи, слеш и закрывающая угловая скобка в конце строк в файле prefs.xml (он же -- settings.xml) не отделены пробелом от остальной части строки, а пробел -- зто первое, что приходит в голову при назначении разделителей.

3. С кодировками у файлов все в порядке -- не Unicode (слава Богу).

4. Если выложенные файлы копировались синхронно, то не факт, что для числового значения из файла prefs.xml (он же -- settings.xml) в файле status.xml (он же -- stat.xml) статус будет "offline" или "online",-- в выложенном файле для искомого значения статус "available".

5. Непонятно, хорошо это или плохо, если для двух, как минимум, значений статус будет "online".


С учётом первых четырёх пунктов BAT-файл был практически полностью переделан.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION>status_new.xml
SET SettingsFile=prefs.xml
SET StatusFile=status.xml
FOR /F "usebackq tokens=6 delims='" %%I IN (`FINDSTR /C:"<pref name='default' type='int' value='" "%SettingsFile%"`) DO (
FOR /F "usebackq tokens=1,7 delims=:'" %%J IN (`FINDSTR /N %%I "%StatusFile%"`) DO (
IF %%K==%%I (
SET /A VAR1=%%J+1
SET /A VAR2=%%J+4
)))&&^
FOR /F "usebackq tokens=1* delims=:" %%I IN (`FINDSTR /N /R . "%StatusFile%"`) DO (
IF %%I==!VAR1! (
ECHO ^<state^>online^</state^>>>status_new.xml
) ELSE (
IF %%I==!VAR2! (
ECHO ^<state^>online^</state^>>>status_new.xml
) ELSE (
SET /P "VAR3=%%J" 0>nul 1>>status_new.xml
ECHO.>>status_new.xml
)))&&^
TYPE status_new.xml>"%StatusFile%"
DEL status_new.xml

unkilledfore
07-06-2013, 09:42
спасибо, работает!
высланные файлы немного отличаются от первоначальных по причинам, не зависящим от меня. Извиняюсь за неправильную постановку задачи и Ваше потраченное впустую время.
по поводу 5 пункта - не важно, какие статусы online или offline будут у других значений, главное, чтобы online был у текущего значения
Еще раз спасибо за помощь.

Насколько сложно будет дополнить скрипт так, чтобы в файле status.xml удалялись все блоки, кроме искомого (того, который найден в prefs.xml) ?

Georgio
07-06-2013, 11:10
Насколько сложно будет дополнить скрипт так, чтобы в файле status.xml удалялись все блоки, кроме искомого (того, который найден в prefs.xml) ? »

Это возможно. Я подумаю.

Georgio
08-06-2013, 10:05
unkilledfore, "испытайте":

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET SettingsFile=prefs.xml
SET StatusFile=status.xml
FOR /F "tokens=6 delims='" %%I IN ('FINDSTR /C:"<pref name='default' type='int' value='" "%SettingsFile%"') DO (
FOR /F "usebackq tokens=1,7 delims=:'" %%J IN (`FINDSTR /N %%I "%StatusFile%"`) DO (
IF %%K==%%I (
FOR /L %%L IN (1,1,7) DO (
SET /A VAR%%L=%%J+%%L-1
ECHO ^<?xml version='1.0' encoding='UTF-8' ?^>>status_new.xml
ECHO ^<statuses version='1.0'^>>>status_new.xml
))))&&(
FOR /F "usebackq tokens=1* delims=:" %%I IN (`FINDSTR /N /R . "%StatusFile%"`) DO (
IF %%I==!VAR1! (
SET /P p="%%J" 0>nul 1>>status_new.xml
ECHO.>>status_new.xml
)
IF %%I==!VAR2! (
ECHO ^<state^>online^</state^>>>status_new.xml
)
IF %%I==!VAR3! (
ECHO ^<substatus^>>>status_new.xml
)
IF %%I==!VAR4! (
SET /P p="%%J" 0>nul 1>>status_new.xml
ECHO.>>status_new.xml
)
IF %%I==!VAR5! (
ECHO ^<state^>online^</state^>>>status_new.xml
)
IF %%I==!VAR6! (
ECHO ^</substatus^>>>status_new.xml
)
IF %%I==!VAR7! (
ECHO ^</status^>>>status_new.xml
)))&&^
ECHO ^</statuses^>>>status_new.xml&&^
TYPE status_new.xml>"%StatusFile%"
DEL status_new.xml




© OSzone.net 2001-2012