PDA

Показать полную графическую версию : Замена значения в ковычках


Akiyamka
04-09-2014, 01:10
Пишу свой первый скрипт на 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
Akiyamka, упакуйте образец Вашего реального xml-файла в архив и приложите к сообщению.

Georgio
04-09-2014, 11:26
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
Iska, и Georgio, начну с того, что скажу Вам огромное спасибо что отозвались. прикрепил файл xml. Ключи screenheight=" " и screenwidth=" ". Задача в том, чтобы их значения менять на введенные через диалоговое окно.

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

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

Georgio
05-09-2014, 04:34
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
Georgio, шикарно, http://s2.postimg.org/3pnd2mjqd/Nya.jpg (http://postimg.org/image/3pnd2mjqd/)

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

Iska
11-09-2014, 14:38
эти значения по умолчанию (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
Красота, огромное спасибо!




© OSzone.net 2001-2012