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

TheLeon 08-05-2018 18:54 2812644

Замена строк в файле формата .xml
 
Здравствуйте, уважаемые форумчане OSZone.net. Нужна помощь, а именно:
в файле, например, "example.xml" нужно найти и заменить строку "<MediaPath Path="Media" />" на "<MediaPath Path="Media" /><MediaPath Path="Vehicles" />" (второе пункт, "Vehicles", со следующей строчки). Возможно ли это сделать через .bat файл?

Файл 152439

Iska 08-05-2018 19:06 2812648

TheLeon, зависит от содержимого файла. Надёжнее использовать WSH/PowerShell.

Упакуйте оригинальный файл .xml и откорректированный файл .xml в архив и приложите к сообщению.

Iska 08-05-2018 20:14 2812665

Это не вполне 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, то последний будет добавлен.

TheLeon 09-05-2018 07:43 2812720

Iska, здравствуйте ещё раз, на счёт оболочки PowerShell, т.е. каждому придётся менять политику PowerShell(а то по-умолчанию: блокирует все скрипты), без этого ограничения никак сделать нельзя, верно? Или можно, например, через батник изменить политику(если возможно) и потом уже запустить сам скрипт?

Iska 09-05-2018 12:13 2812766

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


TheLeon 09-05-2018 18:06 2812821

Iska, опять проблема, вроде пытаюсь запустить, но выдает ошибку, что не может найти "Config.xml" - это из-за того(наверно), что я поставил вместо "strSourceFile = "С:/.../config.xml"" на "strSourceFile = "config.xml"", т.е. надо ставить полный путь? (извиняюсь за тупость, просто ни разу не пользовался подобными средствами).
-
P.S: Задумка была такова: установщик(созданный на Inno Setup) заканчивает установку основных файлов для игры, затем запускается батник(или подобное) и прописывает дополнительные строчки (например, "<MediaPath Path="Vehicles" />") в конфигурационном файле(это для того, чтобы папка тоже была задействована при запуске игрушки).

Iska 09-05-2018 19:20 2812830

Цитата:

Цитата TheLeon
т.е. надо ставить полный путь? »

Желательно.

Цитата:

Цитата TheLeon
P.S: Задумка была такова: установщик(созданный на Inno Setup) заканчивает установку основных файлов для игры, затем запускается батник(или подобное) и прописывает дополнительные строчки (например, "<MediaPath Path="Vehicles" />") в конфигурационном файле »

В зависимости от чего прописывает «дополнительные строчки»? Как Вы определяете, какие именно строки требуется добавлять? Или не добавлять? Иными словами говоря, зачем что-то добавлять вместо того, чтобы извлекать готовый файл с уже сразу добавленными параметрами?

Цитата:

Цитата TheLeon
это для того, чтобы папка тоже была задействована при запуске игрушки »

Поясните?

TheLeon 10-05-2018 14:14 2812948

Iska, как-то не подумал о готовом файле, спасибо за помощь и извините, что занял ваше время.

Iska 10-05-2018 14:38 2812951

TheLeon, нет, ну, если у Вас действительно в зависимости от каких-то параметров инсталляции в случае а) добавляется одно, в случае б) добавляется другое, в случае в) добавляется первое и третье, а в случае г) не добавляется ничего — тогда, действительно, имеет смысл именно корректировать файл (причём, прямо из-под инсталляции, посредством встроенного языка), а не делать кучу готовых файлов на все случаи жизни.

TheLeon 10-05-2018 14:42 2812954

Iska, а, слушайте: я задал вопрос о скрипте потому, что этот файл (config.xml), мог уже до начала установки редактирован, т.е. уже были добавленные какие-нибудь строчки, вот я и хотел с помощью скрипта добавить свои строчки в этот файл, автоматизированно.
-
Каждая строчка отвечала за подгрузку файлов для игры, от стандартных до кастомных(моды).
-
И тут появляется опять проблема, как поставить путь до файла, в соответствие с настройками пользователя(смотря какой он путь выбрал).

Iska 10-05-2018 15:00 2812959

Цитата:

Цитата TheLeon
И тут появляется опять проблема, как поставить путь до файла, в соответствие с настройками пользователя(смотря какой он путь выбрал). »

TheLeon, самый простой способ — указать путь к файлу аргументом скрипта при его вызове из инсталляции. Там ведь есть предопределённые константы/переменные, вида "{app}", так? Вот надо и указать этот "{app}\config.xml" (или где он там будет) аргументом скрипта. Естественно, сам скрипт надо будет слегка подправить, чтобы он этот аргумент принимал и обрабатывал.

Iska 17-05-2018 09:36 2814129

Покажите код Вашего скрипта .iss. Покажите в нём место для вызова скрипта .vbs.

Iska 17-05-2018 10:13 2814136

TheLeon, надо не просто прятать под спойлер, а сначала — обрамить тэгом «code», и только затем обрамлять тэгом «spoiler».

Этого недостаточно. Повторяю:
Цитата:

Цитата Iska
Покажите в нём место для вызова скрипта .vbs. »

Я не вижу в Вашем скрипте .iss ни единого упоминания config.xml или какого-либо .vbs.

Iska 17-05-2018 12:36 2814167

Не проверялось.

vehicles.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!

.iss
Код:

[Run]
Filename: """{sys}\wscript.exe"""; Parameters: """{app}\User\vehicles.vbs"" ""{app}\User\config.xml"""; WorkingDir: """{app}\User"""


TheLeon 17-05-2018 19:47 2814241

Iska, спасибо, всё работает.


Время: 23:09.

Время: 23:09.
© OSzone.net 2001-