<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: замена слов в XML файле]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=9237</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=9237&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: замена слов в XML файле».]]></description>
		<lastBuildDate>Sat, 08 Feb 2014 23:17:50 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79899#p79899</link>
			<description><![CDATA[<div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>Кстати, как работать с utf-8 в WSH?</p></blockquote></div><p>В данном случае — просто «XmlDocument.load()».</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 08 Feb 2014 23:17:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79899#p79899</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79898#p79898</link>
			<description><![CDATA[<p>Может, кому-нибудь будет интересно моё решение.<br />Вместо <strong>$</strong> должны использоваться восклицательные знаки (если в source.xml потребуется использовать восклицательный знак сам по себе, его надо предварять <strong>^</strong>).<br />В качестве имён подставляемых переменных не следует использовать <strong>!count!</strong> и <strong>!line!</strong>, т.к. они используются во внутренних целях.<br />Не учтена возможность ввода пользователем символов специальных для XML.</p><p><em>(<span class="bbu">10.02.2014</span>: В присоединённый архив включен файл <strong>source.xml</strong> с <strong>$</strong> заменёнными на <strong>!</strong>; ниже приведён код командного файла, содержащего непечатные знаки — для запуска брать файл из присоединённого архива.)</em><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>@echo off
if &quot;%~1&quot;==&quot;/UTF16&quot; goto UTF16
setlocal enableextensions enabledelayedexpansion
call :Input
(
cmd.exe /a /d /c set /p p= ?&lt;nul
cmd /u /v /d /c &quot;%~f0&quot; /UTF16
)&gt;utf16.tmp
chcp 65001&gt;nul &amp; cmd /a /d /c type utf16.tmp &gt;utf8.tmp &amp; chcp 866&gt;nul
call :Input &gt;nul &lt;utf8.tmp
del utf16.tmp utf8.tmp
call :SUB &lt;source.xml &gt;unattend.xml
endlocal
exit /b
::------------------

:Input
set /p &quot;username=Введите имя пользователя на латинице. Например vpupkin: &quot;
set /p &quot;displayusername=Введите отображаемое имя и фамилию пользователя. Например Вася Пупкин: &quot;
set /p &quot;computername=Введите имя компьютера. Например COMP-01: &quot;
exit /b

:UTF16
:: Здесь перечислите все переменные в том же порядке, что и при вводе:
echo:!username!
echo:!displayusername!
echo:!computername!
exit /b

:SUB
for /f %%n in (&#039;find.exe /c /v &quot;&quot;^&lt;source.xml&#039;) do set count=%%n
:sub.loop:
if %count%==0 exit /b
    set &quot;line=&quot;
    set /p &quot;line=&quot;
    if defined line (
        set &quot;line=!line:^=^^!&quot;
        set line=!line:^&quot;^=^^^&quot;!
        set &quot;line=!line:&amp;=^&amp;!&quot;
        set &quot;line=!line:|=^|!&quot;
        set &quot;line=!line:&lt;=^&lt;!&quot;
        set &quot;line=!line:&gt;=^&gt;!&quot;
    )
    echo:%line%
set /a count-=1
goto sub.loop
</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Sat, 08 Feb 2014 23:14:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79898#p79898</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79897#p79897</link>
			<description><![CDATA[<p>Чтобы добавить новую перменную достаточно добавить только строку ивда<br /></p><div class="codebox"><pre><code>set /p &quot;newvarname=введите значение newvarname: &quot;</code></pre></div><p>фрагмент кода </p><div class="codebox"><pre><code>usebackq tokens=1,2,3 delims=$</code></pre></div><p> отвечает за разделение строки на ТРИ подстроки и их размещение по параметрам цикла. Этот код предполагает, что входная строка выглядит ТОЧНО так как показано ниже </p><div class="codebox"><pre><code>начало$середина$конец</code></pre></div><p>. </p><p>Символ $ несет &quot;смысловую нагрузку&quot; - он служит разделителем подстрок. При этом средняя часть (&quot;середина&quot; в примере выше) является именем переменной (как например newvarname в примере еще выше). Если Вы удалите этот символ, то Вам потребуется ввести какй-то другой символ в качетсве разделителя. ПРи этом он не должен пересекаться с другими символами файла source.xml.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 08 Feb 2014 22:47:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79897#p79897</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79896#p79896</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Попробуйте так: <br /></p><div class="codebox"><pre><code>
@echo off

setlocal

set &quot;FILE_SRC=source.xml&quot;
set &quot;FILE_DST=unattend.xml&quot;

set /p &quot;val_username=Введите имя пользователя на латинице. Например vpupkin: &quot;
set /p &quot;val_displayusername=Введите отображаемое имя и фамилию пользователя. Например Вася Пупкин: &quot;
set /p &quot;val_computername=Введите имя компьютера. Например COMP-01: &quot;

call :read_and_replace &quot;%FILE_SRC%&quot; &gt;&quot;%FILE_DST%&quot;

endlocal
goto :EOF


:read_and_replace
setlocal enabledelayedexpansion

chcp 65001&gt;nul

for /f &quot;usebackq tokens=1,2,3 delims=$&quot; %%a in ( &quot;%~1&quot; ) do (
    if &quot;%%~b&quot; == &quot;&quot; (
        echo:%%a
    ) else (
        set &quot;v=!val_%%b!&quot;
        echo:%%a!v!%%c
    )
)

endlocal
goto :EOF

</code></pre></div><p>Скрипт основывается на предположении, что все изменяемые теги располагаются каждый на отдельной строке. Название слов которые надо переименовать, то есть $displayusername$ можно оставить как и было прежде. В переменные FILE_SRC и FILE_DST пропишите реальные пути к исходному и результирующему файлам.</p></blockquote></div><p>Большое вам спасибо, скрипт отработал на ура.</p><p>Я правильно понимаю, что бы добавить к этому скрипту новую переменную, то мне достаточно добавить новую set /p, и в</p><div class="codebox"><pre><code>usebackq tokens=1,2,3 </code></pre></div><p> добавить цифру 4? Я так понимаю что usebackq tokens отвечает за введённые ранее переменные? И что изменить в коде, если я хочу убрать знаки $?</p>]]></description>
			<author><![CDATA[null@example.com (danishru)]]></author>
			<pubDate>Sat, 08 Feb 2014 22:22:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79896#p79896</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79895#p79895</link>
			<description><![CDATA[<p><strong>Rumata</strong>,<br /></p><div class="codebox"><pre><code>chcp 65001&gt;nul</code></pre></div><p>будет работать не на всех системах. У меня, например, скрипт тихо завершит работу, если только это не часть составной команды, в конце которой кодировка меняется обратно.</p><p>Да, и как помнится, если переключить кодировку внутри команды, вывод которой перенаправлен, больше ничего выведено не будет.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Sat, 08 Feb 2014 22:12:43 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79895#p79895</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79894#p79894</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>при наличии технологии, специально предназначенной для обработки xml-файлов</p></blockquote></div><p>Тут скорее обработка простого текста, обход DOM скорее запутает задачу, чем поможет.<br />Кстати, как работать с utf-8 в WSH? Не представляю как через FSO. Через ADO?</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Sat, 08 Feb 2014 22:07:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79894#p79894</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79891#p79891</link>
			<description><![CDATA[<div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>alexii, если забыть про UTF-8 и думать, что всё в CP866, сделаете BAT?</p></blockquote></div><p>Не вижу большого смысла делать на пакетных файлах при наличии технологии, специально предназначенной для обработки xml-файлов — подводных камней слишком много. Так что — я пас.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 08 Feb 2014 21:57:08 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79891#p79891</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79890#p79890</link>
			<description><![CDATA[<p>Попробуйте так: <br /></p><div class="codebox"><pre><code>
@echo off

setlocal

set &quot;FILE_SRC=source.xml&quot;
set &quot;FILE_DST=unattend.xml&quot;

set /p &quot;val_username=Введите имя пользователя на латинице. Например vpupkin: &quot;
set /p &quot;val_displayusername=Введите отображаемое имя и фамилию пользователя. Например Вася Пупкин: &quot;
set /p &quot;val_computername=Введите имя компьютера. Например COMP-01: &quot;

call :read_and_replace &quot;%FILE_SRC%&quot; &gt;&quot;%FILE_DST%&quot;

endlocal
goto :EOF


:read_and_replace
setlocal enabledelayedexpansion

chcp 65001&gt;nul

for /f &quot;usebackq tokens=1,2,3 delims=$&quot; %%a in ( &quot;%~1&quot; ) do (
    if &quot;%%~b&quot; == &quot;&quot; (
        echo:%%a
    ) else (
        set &quot;v=!val_%%b!&quot;
        echo:%%a!v!%%c
    )
)

endlocal
goto :EOF

</code></pre></div><p>Скрипт основывается на предположении, что все изменяемые теги располагаются каждый на отдельной строке. Название слов которые надо переименовать, то есть $displayusername$ можно оставить как и было прежде. В переменные FILE_SRC и FILE_DST пропишите реальные пути к исходному и результирующему файлам.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 08 Feb 2014 21:47:38 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79890#p79890</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79885#p79885</link>
			<description><![CDATA[<div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p><strong>danishru</strong>, насколько срочно?</p><p><strong>alexii</strong>, если забыть про UTF-8 и думать, что всё в CP866, сделаете BAT? Я бы адаптировал под UTF-8.</p></blockquote></div><p>Да не очень и срочно это, пока сделал открытие блокнота для изменений, но хотелось бы автоматизировать весь процесс, так как менять только 3 слова надо будет в основном.</p><p>Нашел я в интернете такой vbs скрипт, который меняет слово.</p><div class="codebox"><pre><code>
&#039;============================================= 
 &#039; Замена текста в файле 
&#039; 
 &#039; Параметры: 
 &#039; {файл} {текст для поиска} {текст для замены} 
 &#039;============================================= 
Option Explicit 
 Dim FSO, F, Str1, Str2, Text 
 Set FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;) 
 With WScript 
   F    = .Arguments(0) 
   Str1 = .Arguments(1) 
   Str2 = .Arguments(2) 
 End With 
 F = FSO.GetAbsolutePathName(CreateObject(&quot;WScript.Shell&quot;).ExpandEnvironmentStrings(F)) 

 Text = FSO.OpenTextFile(F, 1).ReadAll 
 Text = Replace(Text, Str1, Str2, 1, -1, 1) 
 FSO.OpenTextFile(F, 2).Write Text 

 Set FSO = Nothing 
 WScript.Quit 0
</code></pre></div><p>Но он не дружит с русским языком.</p><p>А запускаю я его с помощью BAT файла, с таким содержанием.</p><div class="codebox"><pre><code>findrename3.vbs &quot;source2.xml&quot; &quot;guid-01&quot; &quot;Петров&quot;</code></pre></div><p>Предварительно, я изменил название слов которые надо переименовать, то есть $displayusername$ поменял на guid-01, так как идея использовать $ была глупой. )</p>]]></description>
			<author><![CDATA[null@example.com (danishru)]]></author>
			<pubDate>Sat, 08 Feb 2014 20:46:30 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79885#p79885</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79883#p79883</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><div class="quotebox"><blockquote><p>Кодировка xml файла utf-8,</p></blockquote></div><p>Используйте WSH или PoSH.</p></blockquote></div><p>Мне бы с CMD совладать бы, а вы про WSH или PowerShell.</p>]]></description>
			<author><![CDATA[null@example.com (danishru)]]></author>
			<pubDate>Sat, 08 Feb 2014 20:43:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79883#p79883</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79881#p79881</link>
			<description><![CDATA[<p><strong>danishru</strong>, насколько срочно?</p><p><strong>alexii</strong>, если забыть про UTF-8 и думать, что всё в CP866, сделаете BAT? Я бы адаптировал под UTF-8.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Sat, 08 Feb 2014 20:04:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79881#p79881</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79879#p79879</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Кодировка xml файла utf-8,</p></blockquote></div><p>Используйте WSH или PoSH.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 08 Feb 2014 19:49:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79879#p79879</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: замена слов в XML файле]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=79876#p79876</link>
			<description><![CDATA[<p>Доброго времени суток господа.</p><p>Начал я писать скрипт для автоматизации установки Windows из среды WinPE с пользовательским вводом информации, и столкнулся со следующей проблемой.</p><p>Есть xml файл, который является файлом ответа, с заранее заданными параметрами установки Windows, и мне необходимо что бы пользователь в интерактивном режиме, допустим с помощью переменных, изменял в этом файле некоторые слова, например $computername$, $username$ и $displayusername$ на русские и английские слова. Знак доллар можно заменить чем угодно, да и слова могут быть разными. BAT файл должен выполнятся в кодировке OEM-866.</p><p>Кусок исходного xml кода:</p><div class="codebox"><pre><code>
&lt;LocalAccount wcm:action=&quot;add&quot;&gt;
      &lt;DisplayName&gt;$displayusername$&lt;/DisplayName&gt;
      &lt;Group&gt;Users&lt;/Group&gt;
      &lt;Name&gt;$username$&lt;/Name&gt;
&lt;/LocalAccount&gt;</code></pre></div><p>Кусок того, что хочу получить:</p><div class="codebox"><pre><code>
&lt;LocalAccount wcm:action=&quot;add&quot;&gt;
      &lt;DisplayName&gt;Вася Пупкин&lt;/DisplayName&gt;
      &lt;Group&gt;Users&lt;/Group&gt;
      &lt;Name&gt;vpupkin&lt;/Name&gt;
&lt;/LocalAccount&gt;</code></pre></div><p>Кодировка xml файла utf-8, notepad++ показывает ANSI as utf-8, после внесения изменения файл должен отображаться в стандартном блокноте и браузере нормально, русские буквы должны отображаться без крякозябр, кодировка должна остаться такой же. Исходный файл должен остаться нетронутым, а новый должен называться unattend.xml и перемещен по заданному пути.</p><p>Для пользователя должно это выглядеть следующем образом.</p><div class="codebox"><pre><code>
1. Введите имя пользователя на латинице. Например vpupkin:
2. Введите отображаемое имя и фамилию пользователя. Например Вася Пупкин:
3. Введите имя компьютера. Например COMP-01:</code></pre></div><p>Исходный xml файл прикладываю.</p>]]></description>
			<author><![CDATA[null@example.com (danishru)]]></author>
			<pubDate>Sat, 08 Feb 2014 18:18:37 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=79876#p79876</guid>
		</item>
	</channel>
</rss>
