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

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

Akiyamka 04-09-2014 01:10 2398108

Замена значения в ковычках
 
Пишу свой первый скрипт на VBS для простой задачи: найти в xml файле часть строки, которая выглядит так:
Код:

key="X"
И заменить значение X на Y, который водится в диалоговом окне при запуске скрипта.
Нашел вот такой скрипт:
Код:

Dim fso
Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("config.xml", ForReading)
YNumber=InputBox("ЗначениеY") '
strText = objFile.ReadAll
objFile.Close

strOldText = "key=""X"""
strNewText = YNumber
strNewText = Replace(strText, strOldText, strNewText)

Set objFile = objFSO.OpenTextFile("config.xml", ForWriting) 
objFile.WriteLine strNewText
objFile.Close

Почти подходит, но - надо заранее знать X, который я должен указать в strOldText. А в моём случае X может быть любым числом от 0 до 9999.
Т.е. надо как-то допилить скрипт. Например, чтобы он искал по маске "key=""*""" , а потом целиком заменять найденную строку на "key=""Y""". Или искать часть key=", и заменять на Y все значения до следующей кавычки. Намекните где посмотреть наглядный пример с похожим функционалом.

Iska 04-09-2014 03:23 2398128

Akiyamka, упакуйте образец Вашего реального xml-файла в архив и приложите к сообщению.

Georgio 04-09-2014 11:26 2398221

Код:

File="config.xml"
With WScript.CreateObject("Scripting.FileSystemObject")
 x=Replace(.OpenTextFile(File).ReadAll(),Split(Split(.OpenTextFile(File).ReadAll(),vbCrLf&"key="&Chr(34))(1),Chr(34)&vbCrLf)(0),InputBox("Введите новое значение"))
 .OpenTextFile(File,2).Write(x)
End With


Akiyamka 05-09-2014 01:10 2398566

Вложений: 1
Iska, и Georgio, начну с того, что скажу Вам огромное спасибо что отозвались. прикрепил файл xml. Ключи screenheight=" " и screenwidth=" ". Задача в том, чтобы их значения менять на введенные через диалоговое окно.

Georgio, что-то не завелся.
Код:

Строка: 3
Символ: 1
Ошибка: Индекс выходит за пределы допустимого диапазона: 'number: 1'
Код: 800A0009


Akiyamka 05-09-2014 01:20 2398569

Код:

Split(Split(.OpenTextFile(File).ReadAll(),vbCrLf&"screenheight="&Chr(34))(1),Chr(34)&vbCrLf)(0)
Не совсем понимаю что делает это выражение. зачем нужна (1) после &Chr(34))?

Georgio 05-09-2014 04:34 2398586

Код:

File="config.xml"

set d=CreateObject("Scripting.Dictionary")
d.Add "0", "screenheight"
d.Add "1", "screenwidth"
'''''''''''''''' и т. д. '''''''''''''''''
 
For Each i In d   
 With WScript.CreateObject("Scripting.FileSystemObject")
  x=Replace(.OpenTextFile(File).ReadAll(),Split(Split(.OpenTextFile(File).ReadAll(),d.Item(i)&"="&Chr(34))(1),Chr(34))(0),InputBox("Введите новое значение для "&d.Item(i)))
  .OpenTextFile(File,2).Write(x)
 End With
Next


Akiyamka 05-09-2014 10:18 2398643

Georgio, шикарно,

Akiyamka 10-09-2014 22:11 2401041

Все таки есть у скрипта недостаток. Он перестает работать если значения screenheight=" " и screenwidth=" " одинаковы, или не указаны. Можно как-нибудь его дописать, чтобы он сначала устанавливал эти значения по умолчанию (screenheight="1024" и screenwidth="768"), и только потом менял?

Iska 11-09-2014 14:38 2401346

Цитата:

Цитата Akiyamka
эти значения по умолчанию (screenheight="1024" и screenwidth="768") »

Полагаю, наоборот. Или у Вас экран вертикально развёрнут?

Пробуйте, на WSH:
читать дальше »
Код:

Option Explicit

Const ForWriting = 2


Dim strSourceFile

Dim objFSO
Dim objRegExp

Dim strContent

Dim strScreenHeight
Dim strScreenWidth


strSourceFile = "C:\Песочница\054\config.xml"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strSourceFile) Then
        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
       
        With objRegExp
                .IgnoreCase = True
                .Global = True
        End With
       
        With objFSO.OpenTextFile(strSourceFile)
                strContent = .ReadAll()
                .Close
        End With
       
        objRegExp.Pattern = "(screenheight="")(\d*)("")"
       
        If objRegExp.Test(strContent) Then
                strScreenHeight = Trim(objRegExp.Execute(strContent).Item(0).Submatches.Item(1))
               
                If Len(strScreenHeight) = 0 Then
                        strScreenHeight = "768"
                End If
               
                strScreenHeight = Trim(InputBox("Enter Screen Height:", "Enter Screen Height", strScreenHeight))
               
                If Len(strScreenHeight) = 0 Then
                        WScript.Echo "User cancelled input."
                        WScript.Quit 2
                End If
               
                strContent = objRegExp.Replace(strContent, "$1" & strScreenHeight & "$3")
        Else
                WScript.Echo "Can't find ScreenHeight attribute in file."
                WScript.Quit 3
        End If
       
        objRegExp.Pattern = "(screenwidth="")(\d*)("")"
       
        If objRegExp.Test(strContent) Then
                strScreenWidth = Trim(objRegExp.Execute(strContent).Item(0).Submatches.Item(1))
               
                If Len(strScreenWidth) = 0 Then
                        strScreenWidth = "1024"
                End If
               
                strScreenWidth = Trim(InputBox("Enter Screen Width:", "Enter Screen Width", strScreenWidth))
               
                If Len(strScreenWidth) = 0 Then
                        WScript.Echo "User cancelled input."
                        WScript.Quit 2
                End If
               
                strContent = objRegExp.Replace(strContent, "$1" & strScreenWidth & "$3")
        Else
                WScript.Echo "Can't find ScreenWidth attribute in file."
                WScript.Quit 3
        End If
       
        With objFSO.OpenTextFile(strSourceFile, ForWriting)
                .Write strContent
                .Close
        End With
       
        Set objRegExp = Nothing
Else
        WScript.Echo "Source file [" & strSourceFile & "] not found."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0


Akiyamka 14-09-2014 12:46 2402651

Красота, огромное спасибо!


Время: 20:55.

Время: 20:55.
© OSzone.net 2001-