Показать полную графическую версию : [решено] Замена строк в файле формата .xml
Здравствуйте, уважаемые форумчане OSZone.net. Нужна помощь, а именно:
в файле, например, "example.xml" нужно найти и заменить строку "<MediaPath Path="Media" />" на "<MediaPath Path="Media" /><MediaPath Path="Vehicles" />" (второе пункт, "Vehicles", со следующей строчки). Возможно ли это сделать через .bat файл?
152439
TheLeon, зависит от содержимого файла. Надёжнее использовать WSH/PowerShell.
Упакуйте оригинальный файл .xml и откорректированный файл .xml в архив и приложите к сообщению.
Это не вполне XML.
На PowerShell:
$sSourceFile = 'C:\Мои проекты\0153\config.xml'
if(Test-Path -Path $sSourceFile -PathType Leaf) {
$oXml = [xml](Get-Content -Path $sSourceFile)
if($oXml.SelectSingleNode("/Config/MediaPath[@Path='Vehicles']") -isnot [System.Xml.XmlElement]) {
[System.Xml.XmlElement]$oXmlElement = $oXml.CreateElement('MediaPath')
$oXmlElement.SetAttribute('Path', 'Vehicles') | Out-Null
$oXml.SelectSingleNode("/Config").AppendChild($oXmlElement) | Out-Null
}
$oXml.Save($sSourceFile)
} else {
Write-Host "Can't find source file [$sSourceFile]." -ForegroundColor Red
}
Если у корневого узла Config нет дочернего узла MediaPath с атрибутом Path со значением Vehicles, то последний будет добавлен.
Iska, здравствуйте ещё раз, на счёт оболочки PowerShell, т.е. каждому придётся менять политику PowerShell(а то по-умолчанию: блокирует все скрипты), без этого ограничения никак сделать нельзя, верно? Или можно, например, через батник изменить политику(если возможно) и потом уже запустить сам скрипт?
TheLeon, ну, вот Вам на WSH:
Option Explicit
Dim strSourceFile
Dim objXMLDOMNode
Dim objXMLDOMElement
strSourceFile = "C:\Мои проекты\0153\config.xml"
If WScript.CreateObject("Scripting.FileSystemObject").FileExists(strSourceFile) Then
With WScript.CreateObject("MSXML2.DOMDocument")
If .load(strSourceFile) Then
Set objXMLDOMNode = .SelectSingleNode("/Config/MediaPath[@Path='Vehicles']")
If objXMLDOMNode Is Nothing Then
Set objXMLDOMElement = .CreateElement("MediaPath")
objXMLDOMElement.SetAttribute "Path", "Vehicles"
.SelectSingleNode("/Config").appendChild objXMLDOMElement
Set objXMLDOMElement = Nothing
.save strSourceFile
Else
Set objXMLDOMNode = Nothing
End If
Else
WScript.Echo "Can't load source file [" & strSourceFile & "]."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 1
End If
WScript.Quit 0
Iska, опять проблема, вроде пытаюсь запустить, но выдает ошибку, что не может найти "Config.xml" - это из-за того(наверно), что я поставил вместо "strSourceFile = "С:/.../config.xml"" на "strSourceFile = "config.xml"", т.е. надо ставить полный путь? (извиняюсь за тупость, просто ни разу не пользовался подобными средствами).
-
P.S: Задумка была такова: установщик(созданный на Inno Setup) заканчивает установку основных файлов для игры, затем запускается батник(или подобное) и прописывает дополнительные строчки (например, "<MediaPath Path="Vehicles" />") в конфигурационном файле(это для того, чтобы папка тоже была задействована при запуске игрушки).
т.е. надо ставить полный путь? »
Желательно.
P.S: Задумка была такова: установщик(созданный на Inno Setup) заканчивает установку основных файлов для игры, затем запускается батник(или подобное) и прописывает дополнительные строчки (например, "<MediaPath Path="Vehicles" />") в конфигурационном файле »
В зависимости от чего прописывает «дополнительные строчки»? Как Вы определяете, какие именно строки требуется добавлять? Или не добавлять? Иными словами говоря, зачем что-то добавлять вместо того, чтобы извлекать готовый файл с уже сразу добавленными параметрами?
это для того, чтобы папка тоже была задействована при запуске игрушки »
Поясните?
Iska, как-то не подумал о готовом файле, спасибо за помощь и извините, что занял ваше время.
TheLeon, нет, ну, если у Вас действительно в зависимости от каких-то параметров инсталляции в случае а) добавляется одно, в случае б) добавляется другое, в случае в) добавляется первое и третье, а в случае г) не добавляется ничего — тогда, действительно, имеет смысл именно корректировать файл (причём, прямо из-под инсталляции, посредством встроенного языка), а не делать кучу готовых файлов на все случаи жизни.
Iska, а, слушайте: я задал вопрос о скрипте потому, что этот файл (config.xml), мог уже до начала установки редактирован, т.е. уже были добавленные какие-нибудь строчки, вот я и хотел с помощью скрипта добавить свои строчки в этот файл, автоматизированно.
-
Каждая строчка отвечала за подгрузку файлов для игры, от стандартных до кастомных(моды).
-
И тут появляется опять проблема, как поставить путь до файла, в соответствие с настройками пользователя(смотря какой он путь выбрал).
И тут появляется опять проблема, как поставить путь до файла, в соответствие с настройками пользователя(смотря какой он путь выбрал). »
TheLeon, самый простой способ — указать путь к файлу аргументом скрипта при его вызове из инсталляции. Там ведь есть предопределённые константы/переменные, вида "{app}", так? Вот надо и указать этот "{app}\config.xml" (или где он там будет) аргументом скрипта. Естественно, сам скрипт надо будет слегка подправить, чтобы он этот аргумент принимал и обрабатывал.
Покажите код Вашего скрипта .iss. Покажите в нём место для вызова скрипта .vbs.
TheLeon, надо не просто прятать под спойлер, а сначала — обрамить тэгом «code», и только затем обрамлять тэгом «spoiler».
Этого недостаточно. Повторяю:
Покажите в нём место для вызова скрипта .vbs. »
Я не вижу в Вашем скрипте .iss ни единого упоминания config.xml или какого-либо .vbs.
Не проверялось.
Option Explicit
Dim strSourceFile
Dim objXMLDOMNode
Dim objXMLDOMElement
If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)
If WScript.CreateObject("Scripting.FileSystemObject").FileExists(strSourceFile) Then
With WScript.CreateObject("MSXML2.DOMDocument")
If .load(strSourceFile) Then
Set objXMLDOMNode = .SelectSingleNode("/Config/MediaPath[@Path='Vehicles']")
If objXMLDOMNode Is Nothing Then
Set objXMLDOMElement = .CreateElement("MediaPath")
objXMLDOMElement.SetAttribute "Path", "Vehicles"
.SelectSingleNode("/Config").appendChild objXMLDOMElement
Set objXMLDOMElement = Nothing
.save strSourceFile
Else
Set objXMLDOMNode = Nothing
End If
Else
WScript.Echo "Can't load source file [" & strSourceFile & "]."
WScript.Quit 3
End If
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If
Else
WScript.Echo "Usage: wscript.exe """ & WScript.ScriptFullName & """ <Source file>"
WScript.Quit 1
End If
WScript.Quit 0
Не убирайте инструкцию Option Explicit!
[Run]
Filename: """{sys}\wscript.exe"""; Parameters: """{app}\User\vehicles.vbs"" ""{app}\User\config.xml"""; WorkingDir: """{app}\User"""
Iska, спасибо, всё работает.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.