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

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

_D_V_S_ 16-03-2012 11:18 1880518

VBS: Редактирование текстового файла
 
Здравствуйте!

Подскажите плиз. Сам я в скриптах только начинающий :)
Наваял (по примерам с форумов) скрипт. Он заменяет значения функций в инишнике. Значение можно вводить самому. Но дело в том, что старое значение остаётся - оно следует после нововведённого.

То есть:

Имеем в файле строку:
max = 200
Нам надо чтобы строка приняла вид:
max = 100
(100 - произвольное значение, вводимое нами с помощью UserName=InputBox("Макс [max]","File.ext","ВВОДИТЕ"))

Вот операция замены:
Код:

strOldText = "max = "
strNewText = "max = "&UserName&""
strNewText = Replace(strText, strOldText, strNewText)

Строка принимает вид:
max = 100 200

Где max - функция, 100 - нововведённое значение, 200 - старое значение.

Далее к примеру нам надо поменять значение max на 50.
Строка принимает вид:
max = 50 100 200

И строка пухнет... Я нашел выход только с комментарием ";"
strNewText = "max = "&UserName&" ;"

Строка принимает вид:
max = 50 ;100 ;200

Хоть и - работает программа с таким инишником... Но это совсем не дело :(

Я совсем новичок в VBS. Прошу помощи.

Сам скрипт:
Скрытый текст
Код:

Dim fso
Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("File.ext", ForReading)
UserName=InputBox("Макс [max]","File.ext","ВВОДИТЕ") '
strText = objFile.ReadAll
objFile.Close

strOldText = "max = "
strNewText = "max = "&UserName&"                  ;"
strNewText = Replace(strText, strOldText, strNewText)

Set objFile = objFSO.OpenTextFile("File.ext", ForWriting)
objFile.WriteLine strNewText
objFile.Close

'Dim fso
'Const ForReading = 1
'Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("File.ext", ForReading)
UserName=InputBox("Макс1 [max1]","File.ext","ВВОДИТЕ") '
strText = objFile.ReadAll
objFile.Close

strOldText = "max1 = "
strNewText = "max1 = "&UserName&"                  ;"
strNewText = Replace(strText, strOldText, strNewText)

Set objFile = objFSO.OpenTextFile("File.ext", ForWriting)
objFile.WriteLine strNewText

objFile.Close


Тут в конце строки
Код:

strNewText = "max1 = "&UserName&"                  ;"
";" это комментарий.
Программа не воспринимает закомментированное старое значение. Иного выхода борьбы со следами старых значений не нашёл...
Но хоть что-то :) Только вот плодятся эти комментарии после каждого введённого значения. Строка распухает.

Мысли:
1) Использовать для поиска регулярные выражения. Убейте - не понимаю, как сделать реплейс на инпутбокс в них...
2) Сначала удалить найденную строку, а потом на её место записать "max1 = "&UserName&". Не нашёл как удалять строчки...
3) Закомментировать найденную строку, а потом на следующую строку записать "max1 = "&UserName&". Файл распухнет теперь построчно...
4) Мысль работать с копией файла. То есть с самого начала создаётся копия файла в каком-нмбуль каталоге, и при каждом изменении - удаляется текущий файл а на его место копируется мастер-копия и все операции проводятся с ней.
//То есть:
4-0) создаём папку "BackUp"
4-1) копируем туда File.Ext
4-2) удаляем исходный File.Ext
4-3) копируем из BackUp File.ext обратно
4-4) конец операции

Вопрос: как можно сие провернуть?

DmitriiV 16-03-2012 12:39 1880582

Цитата:

Цитата _D_V_S_
Использовать для поиска регулярные выражения. Убейте - не понимаю »

Пример:
Код:

myString = "max = 101" & vbNewLine & "max = 102" & vbNewLine & "max = 103"
strTemp = Trim(InputBox("Число:"))
If Len(strTemp) > 0 Then
        If IsNumeric(strTemp) Then
                Set objRegExp = CreateObject("VBScript.RegExp")
                objRegExp.Global = True
                objRegExp.IgnoreCase = True
                objRegExp.Pattern = "max = \d+"
                MsgBox objRegExp.Replace(myString, "max = " & strTemp)
                Set objRegExp = Nothing
        Else
                MsgBox "Неверное значение."
        End If
End If


_D_V_S_ 16-03-2012 13:27 1880604

DmitriiV,

Спасибо!

Только я совсем запутался...
Пробовал и так и эдак вставлять Ваш код в сценарий...

Но в лучшем случае на выходе получаю файлы вида:
Код:

max_item_mass = 101
max_item_mass = 102
max_item_mass = 103

И всё. Остальное содержимое файла - стирается.

Если не затруднит - пожалуйста набросайте полностью код ( с комментами если можно) - я в тупике :(

DmitriiV 16-03-2012 14:31 1880663

Цитата:

Цитата _D_V_S_
... Остальное содержимое файла - стирается »

Это же был лишь пример на использование регулярных выражений.
Цитата:

Цитата _D_V_S_
... набросайте полностью код »

Как-то так (проверку не делал):
Код:

Dim objRegExp, objFSO, objFile
Dim strText, UserName, strNewText
Const ForReading = 1
Const ForWriting = 2

Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Global = True
objRegExp.IgnoreCase = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
UserName = Trim(InputBox("Макс [max]", "File.ext", "ВВОДИТЕ"))
If Len(UserName) > 0 Then
    While Not IsNumeric(UserName)
        MsgBox "Задано не числовое значение. Повторите ввод.", vbExclamation
        UserName = Trim(InputBox("Макс [max]", "File.ext", "ВВОДИТЕ"))
    Wend
    Set objFile = objFSO.OpenTextFile("File.ext", ForReading)
    strText = objFile.ReadAll
    objFile.Close
    objRegExp.Pattern = "max = \d+"
    strNewText = objRegExp.Replace(strText, "max = " & UserName)
    Set objFile = objFSO.OpenTextFile("File.ext", ForWriting)
    objFile.WriteLine strNewText
    objFile.Close
End If
UserName = Trim(InputBox("Макс1 [max1]", "File.ext", "ВВОДИТЕ"))
If Len(UserName) > 0 Then
    While Not IsNumeric(UserName)
        MsgBox "Задано не числовое значение. Повторите ввод.", vbExclamation
        UserName = Trim(InputBox("Макс1 [max1]", "File.ext", "ВВОДИТЕ"))
    Wend
    Set objFile = objFSO.OpenTextFile("File.ext", ForReading)
    strText = objFile.ReadAll
    objFile.Close
    objRegExp.Pattern = "max1 = \d+"
    strNewText = objRegExp.Replace(strText, "max1 = " & UserName)
    Set objFile = objFSO.OpenTextFile("File.ext", ForWriting)
    objFile.WriteLine strNewText
    objFile.Close
End If
Set objFile = Nothing
Set objFSO = Nothing
Set objRegExp = Nothing
WScript.Quit 0


_D_V_S_ 17-03-2012 13:03 1881161

DmitriiV,
Огромное спасибо!

Начинаю немного понимать...

Вот регулярное выражение - думаю как написать...
Код:

max(тут любое кол-во пробелов или ТАБ-ов)=(тут любое кол-во пробелов или ТАБ-ов)\d+
Любое кол-во - это от нуля. То есть и отсутствие тоже. Как написать... Спасибо ещё раз сразу!!
Не подскажешь?

PS Если VBS этот получится - многие мои друзья спасибо скажут! Я в комментах к нему тебя укажу.

DmitriiV 20-03-2012 08:02 1883006

_D_V_S_, смотрите здесь http://forum.script-coding.com/viewt...d=58092#p58092.


Время: 11:36.

Время: 11:36.
© OSzone.net 2001-