Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Перенести в XML имя компьютера заменив часть текст. (http://forum.oszone.net/showthread.php?t=322910)

iluha_nam 18-01-2017 23:59 2704611

Перенести в XML имя компьютера заменив часть текст.
 
Добрый вечер!
Покопался на форуме несколько часов, перепробовал найденные примеры, но не смог сделать сам, помогите новичку.
Необходимо создать батник который в файле XML заменить в строке <Server>USER-PC/3050</Server> значение "USER-PC" на реальное имя компьютера.
XML выглядит так:
<?xml version="1.0" encoding="windows-1251"?>
<Settings>
<DB>
<Type>Firebird</Type>
<Server>USER-PC/3050</Server>
<Database>C:\Taxcom\Docliner Single\DB\Docliner.fdb</Database>
<IntegratedSecurity>False</IntegratedSecurity>
<Login>Login</Login>
<Password>Password</Password>
<DatabaseMK>C:\Taxcom\Docliner Single\DB\Docliner_MK.fdb</DatabaseMK>
<Filestream>C:\Taxcom\Docliner Single\DB\Filestream</Filestream>
<CountConnection>5</CountConnection>
</DB>
</Settings>

iluha_nam 19-01-2017 00:05 2704612

Пытаюсь подогнать имеющиеся примеры под себя, пока дошел до момента
@echo off
setlocal enabledelayedexpansion
Set 1=hostname
Set _find="USER-PC"
Set _replace=1
for %%J in (Settings.xml) do (
Дальше не знаю какая должна быть команда :( Если я хотя бы начало правильно делаю..

iluha_nam 19-01-2017 00:29 2704616

Set infile=Settings.xml
Set hostname=%COMPUTERNAME%
Set find=USER-PC
Set replace=hostname

setlocal enabledelayedexpansion
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set LINE=!LINE:%find%=%replace%!
@echo !LINE!>>Settings1.xml
)
endlocal

Мне осталось только вместо %COMPUTERNAME% получить команду которая мне даст реальное имя пк. Помогите!

Все. Доперло до нуба.

Set infile=Settings.xml
Set find=USER-PC
Set replace=%COMPUTERNAME%

setlocal enabledelayedexpansion
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set LINE=!LINE:%find%=%replace%!
@echo !LINE!>>Settings1.xml
)
endlocal

Всем спасибо, расходимся. :)))

iluha_nam 19-01-2017 02:05 2704633

Блин. Теперь другая проблема. Думал будет легко, ан нет.
Я копирую этот батник в целевой каталог другим батником. Но вот как его теперь там запустить???

call "C:\dot\cat\Client\2.bat"

не работает.

start "C:\dot\cat\Client\2.bat"

тоже не работает. Пробовал убирать кавычки - не помогает. Помогите...

alpap 19-01-2017 03:35 2704637

Код:

@echo off
set "f=file.xml"
set "tg=<Server>"
set "sz=%Computername%"
<"%f%">$ (for /f "delims=" %%a in ('more') do @(
  echo "%%~a"|>nul find "%tg%" && (
  for /f "tokens=1,3 delims=><" %%b in ("%%~a") do @echo:^<%%b^>%sz%^<%%c^>
  ) || (
  echo %%a
  )
 )
)& >nul move $ "%f%"
exit

Цитата:

Цитата iluha_nam
как его теперь там запустить »

достаточно: "Путь\name.bat"
через start не забываем заголовок: start "" "C:\dot\cat\Client\2.bat"

iluha_nam 19-01-2017 19:44 2704742

Ваш пример не меняет параметр. Мой меняет. Я потом дописал чтобы он удалял Settings.xml и переименовывал Settings1.xml

Set infile=Settings.xml
Set find=USER-PC
Set replace=%COMPUTERNAME%

setlocal enabledelayedexpansion
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set LINE=!LINE:%find%=%replace%!
@echo !LINE!>>Settings1.xml
)
del Settings.xml
ren Settings1.xml Settings.xml
endlocal


Но так и не понял как запустить батник из каталога...
Цитата:

Цитата alpap
через start не забываем заголовок »

Про заголовок не понял :( Можно примером?

alpap 19-01-2017 21:51 2704785

Цитата:

Цитата iluha_nam
Можно примером? »

я привел выше
так понятнее:
Код:

start "Заголовок" "C:\dot\cat\Client\2.bat"
если нет просто "" ставить надо, таков синтаксис
Код:

start /?
Цитата:

Цитата iluha_nam
Ваш пример не меняет параметр »

как вы это видите
в вашем коде моего примера в строке
set "f=file.xml"
имя файла совпадает с реальным?

Iska 19-01-2017 22:51 2704800

На WSH:
Скрытый текст
Код:

Option Explicit

Dim strSourceFile

If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        If WScript.CreateObject("Scripting.FileSystemObject").FileExists(strSourceFile) Then
                With WScript.CreateObject("Microsoft.XMLDOM")
                        .load(strSourceFile)
                       
                        With .selectSingleNode("/Settings/DB/Server")
                                .text = Replace(.text, "USER-PC", WScript.CreateObject("WScript.Network").ComputerName)
                        End With
                       
                        .Save strSourceFile
                End With
        Else
                WScript.Echo "Can't find source file [" & strSourceFile & "]."
                WScript.Quit 2
        End If
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


iluha_nam 23-01-2017 21:07 2705671

WSH это уже чутка другое, это мне еще пока рановато..
В общем там и не смог запустить даже когда заменил на Settings ничего не изменилось.
Цитата:

Цитата alpap
set "f=file.xml" »

Сейчас получается все кроме одного. Запускаю я свой батник из нужного каталога, рассчитывая, что если он находится в каталоге с нужным файлом Settings.xml, то и он в нем и отработает. По факту же то место от куда я запускаю батник для старта там и меняются настройки файла Settings.xml.
Как мне сделать так, чтобы мой батник изменил параметр в другой папке.

Если проще по задаче, чтобы меньше неясностей было. У меня есть куча однотипным компов, мне нужно в 2 местах заменить в файле Settings.xml USER-PC на реальное имя компа.
Я хочу копировать куда-нибудь на рабочий стол папку с 2-мя батниками, одни скопирует другой в эти 2 места и запустит его там. Но судя по всему запускать можно и с рабочего стола, просто указав правильно путь до нужных Settings.xml

Помогите :(

alpap 24-01-2017 03:24 2705722

iluha_nam,
если ваш файл Settings.xm выглядит как вы написали, то как видите все работает:
Файл 142912

megaloman 24-01-2017 19:55 2705945

Если в строке <Server>USER-PC/3050</Server> больше ничего нет, то вот решение
Код:

@echo off
Set "FileIn=Z:\Box_In\Ку ку.xml"
Del "%FileIn%.tmp" 2>nul

Set "RepIn=<Server>USER-PC/3050</Server>"
Set "RepOut= ^<Server^>%ComputerName%/3050^</Server^>

SetLocal EnableExtensions EnableDelayedExpansion

FOR /F "usebackq delims=[]" %%i IN (`Find /N "%RepIn%" "%FileIn%"`) DO Set /A "N=%%i" 2>nul
Set /A ii=0
FOR /F "usebackq delims=" %%s IN (`more "%FileIn%"`) DO (
        Set /A ii+=1
        If !ii!==%N% (Echo %RepOut%>>"%FileIn%.tmp") Else (Echo %%s>>"%FileIn%.tmp") 
)
Move /Y "%FileIn%.tmp" "%FileIn%" >nul

alpap, у меня почему-то ваш батник отрабатывает неправильно
Вот исходный файл(Z:\Box_In\Ку ку.xml)
Код:

<?xml version="1.0" encoding="windows-1251"?>
 <Settings>
 <DB>
 <Type>Firebird</Type>
 <Server>USER-PC/3050</Server>
 <Database>C:\Taxcom\Docliner Single\DB\Docliner.fdb</Database>
 <IntegratedSecurity>False</IntegratedSecurity>
 <Login>Login</Login>
 <Password>Password</Password>
 <DatabaseMK>C:\Taxcom\Docliner Single\DB\Docliner_MK.fdb</DatabaseMK>
 <Filestream>C:\Taxcom\Docliner Single\DB\Filestream</Filestream>
 <CountConnection>5</CountConnection>
 </DB>
 </Settings>

Вот Ваш батник с моим путём
Код:

@echo off

set "f=Z:\Box_In\Ку ку.xml"
set "tg=<Server>"
set "sz=%Computername%"
<"%f%">$ (for /f "delims=" %%a in ('more') do @(
  echo "%%~a"|>nul find "%tg%" && (
  for /f "tokens=1,3 delims=><" %%b in ("%%~a") do @echo:^<%%b^>%sz%^<%%c^>
  ) || (
  echo %%a
  )
 )
)& >nul move $ "%f%"
exit

Вот результат его работы
Код:

<?xml version="1.0" encoding="windows-1251"?>
 <Settings>
 <DB>
 <Type>Firebird</Type>
< >MEGALOMAN<USER-PC/3050>
 <Database>C:\Taxcom\Docliner Single\DB\Docliner.fdb</Database>
 <IntegratedSecurity>False</IntegratedSecurity>
 <Login>Login</Login>
 <Password>Password</Password>
 <DatabaseMK>C:\Taxcom\Docliner Single\DB\Docliner_MK.fdb</DatabaseMK>
 <Filestream>C:\Taxcom\Docliner Single\DB\Filestream</Filestream>
 <CountConnection>5</CountConnection>
 </DB>
 </Settings>


alpap 25-01-2017 02:02 2706021

megaloman,
Исходный: C:\Box_In\Ку ку.xml (кодировка 866)
Код:

<?xml version="1.0" encoding="windows-1251"?>
<Settings>
<DB>
<Type>Firebird</Type>
<Server>USER-PC/3050</Server>
<Database>C:\Taxcom\Docliner Single\DB\Docliner.fdb</Database>
<IntegratedSecurity>False</IntegratedSecurity>
<Login>Login</Login>
<Password>Password</Password>
<DatabaseMK>C:\Taxcom\Docliner Single\DB\Docliner_MK.fdb</DatabaseMK>
<Filestream>C:\Taxcom\Docliner Single\DB\Filestream</Filestream>
<CountConnection>5</CountConnection>
</DB>
</Settings>

Собственно код: (кодировка 866)
Код:

@echo off
set "f=C:\Box_In\Ку ку.xml"
set "tg=<Server>"
set "sz=%Computername%"
<"%f%">$ (for /f "delims=" %%a in ('more') do @(
  echo "%%~a"|>nul find "%tg%" && (
  for /f "tokens=1,3 delims=><" %%b in ("%%~a") do @echo:^<%%b^>%sz%^<%%c^>
  ) || (
  echo %%a
  )
 )
)& >nul move $ "new.xml"
exit

Вывод: (кодировка 866)
Код:

<?xml version="1.0" encoding="windows-1251"?>
<Settings>
<DB>
<Type>Firebird</Type>
<Server>AIVA</Server>
<Database>C:\Taxcom\Docliner Single\DB\Docliner.fdb</Database>
<IntegratedSecurity>False</IntegratedSecurity>
<Login>Login</Login>
<Password>Password</Password>
<DatabaseMK>C:\Taxcom\Docliner Single\DB\Docliner_MK.fdb</DatabaseMK>
<Filestream>C:\Taxcom\Docliner Single\DB\Filestream</Filestream>
<CountConnection>5</CountConnection>
</DB>
</Settings>

Я все проверяю.
Единственно, если у ТС что-то не так выглядит в исходном или оказывает влияние кодировка, то все может быть и не для cmd это дело по большому счету, если будет (что очень реально) кодировка utf-8 и кириллица для полного счастья - cmd точно отдыхает.

Iska 25-01-2017 05:07 2706024

Цитата:

Цитата alpap
Исходный: C:\Box_In\Ку ку.xml (кодировка 866) »

А как же:
Цитата:

Цитата alpap
Код:

<?xml version="1.0" encoding="windows-1251"?>
»

В данном случае, конечно, без разницы, но тем не менее.

Цитата:

Цитата alpap
если будет (что очень реально) кодировка utf-8 »

Не будет. Кодировка указана в xml.

alpap 25-01-2017 13:14 2706109

Цитата:

Цитата Iska
В данном случае, конечно, без разницы, но тем не менее. »

но тем не менее работает правильно, ни пробелы в пути ни кириллица (если код в 866) не мешают, даже проверил на 1251 для пущей уверенности


megaloman,
все, понял в чем причина.
Скопировал именно Ваш вариант содержимого xml и увидел что после строки
<?xml version="1.0" encoding="windows-1251"?>
все последующие строки идут с пробелом в начале строки (случайность? или так положено оформлять xml?)
это ломает выходную картину.

alpap 25-01-2017 13:29 2706112

Для такого варианта написания содержимого код будет таким:
Код:

@echo off
set "f=Z:\Box_In\Ку ку.xml"
set "tg=<Server>"
set "sz=%Computername%"
<"%f%">$ (for /f "delims=" %%a in ('more') do @(
  echo "%%~a"|>nul find "%tg%" && (
  for /f "tokens=2,4 delims=><" %%b in ("%%~a") do @echo: ^<%%b^>%sz%^<%%c^>
  ) || (
  echo %%a
  )
 )
)& >nul move $ "%f%"
exit


Iska 25-01-2017 13:56 2706123

Цитата:

Цитата alpap
и увидел что после строки
<?xml version="1.0" encoding="windows-1251"?>
все последующие строки идут с пробелом в начале строки (случайность? или так положено оформлять xml?) »

Для xml пробельные символы (пробелы, табуляция и т.п.) вообще не имеют значения (не будучи оформлены специальным образом). То есть, xml может и вовсе быть записанным в одну-единственную строку — и при этом оставаться валидным.

megaloman 25-01-2017 14:08 2706125

alpap, Я не знаю, что бы хотел iluha_nam, но я понял задачу, что надо получить строку типа
<Server>TRALALA/3050</Server>

Iska 25-01-2017 14:11 2706127

megaloman, я тоже понял именно так. То есть — заменить часть содержимого узла Server.


Время: 07:15.

Время: 07:15.
© OSzone.net 2001-