1 (изменено: _D_V_S_, 2012-04-02 06:04:23)

Тема: VBS: поиск в тексте и вывод на экран

Здравствуйте!

Я совсем новичок в VBS, помогите с простой задачкой.

Есть инишник, File.ini, в котором надо найти значение определённой переменной и просто вывести его в MSGBOX.

Вот кусок из моего работающего скрипта, но там я произвожу замену значения переменной (через InputBox).

File.ini например:

min = 234234
vin   =   34567
kin    =       88
max   = 68865
fax  =  04534

кусок кода VBS для поиска и замены значения MAX:

UserName = Trim(InputBox("Ля-ля-ля",, "Сюда вводите"))
 Set objFile = objFSO.OpenTextFile("File.ini", ForReading)
 strText = objFile.ReadAll
 objFile.Close
   objRegExp.Pattern = "max\s*=\s*-*\d+"
   strNewText = objRegExp.Replace(strText, "max = " &UserName)
 Set objFile = objFSO.OpenTextFile("File.ini", ForWriting)
 objFile.WriteLine strNewText
 objFile.Close

Нужно вывести перед вводом нового значения - старое в msgbox-е. Чтобы знать, что и на что менять.
Я в ступоре.

А в идеале - чтобы текущее значение переменной писалось в поле ввода InputBox (вместо "Сюда вводите")
Реально такое в VBS" ?

Понимаю, что задачка - из простейших, но часа два бился, и без толку...
Заранее - спасибо!

2

Re: VBS: поиск в тексте и вывод на экран


Set objFile = objFSO.OpenTextFile("File.ini", ForReading)
strText = objFile.ReadAll
objFile.Close
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.IgnoreCase = True
objRegExp.Pattern = "max\s*=\s*-*\d+"
Set objMatches = objRegExp.Execute(strText)
strTemp = objMatches.Item(0)
objRegExp.Pattern = "\d+"
Set objMatches = objRegExp.Execute(strTemp)
strTemp = objMatches.Item(0)
UserName = Trim(InputBox("Ля-ля-ля",,strTemp))
objRegExp.Pattern = "max\s*=\s*-*\d+"
strNewText = objRegExp.Replace(strText, "max = " & UserName)
Set objFile = objFSO.OpenTextFile("File.ini", ForWriting)
objFile.WriteLine strNewText
objFile.Close

3 (изменено: _D_V_S_, 2012-04-02 10:28:21)

Re: VBS: поиск в тексте и вывод на экран

Dmitrii

Огромадное спасибо!
Всё заработало как часы!

А не подскажешь, можно-ли зациклить скрипт?
Может я неправильно выразился, можно-ли сделать в конце скрипта msgbox с текстом "Ввести значения заново? Нажмите ДА. Для выхода нажмите НЕТ" - на случай ошибки ввода не того значения.
И после нажатия на ДА скрипт сначала заработал. Это реально?

Если это не сложно конечно...

Ещё раз спасибо!!

4

Re: VBS: поиск в тексте и вывод на экран

Каков критерий оценки верных/неверных значений?

5

Re: VBS: поиск в тексте и вывод на экран

Нет, я неверно выразился.
Просто ошибся если САМ вводивший. Или передумал.

Я вывожу MSGBOX в конце скрипта с перечнем вновь введённых значений.
Неплохо-б было следующим MSGBOX-ом предложить пере-ввести заново значения...

6 (изменено: Dmitrii, 2012-04-03 06:47:00)

Re: VBS: поиск в тексте и вывод на экран

_D_V_S_ пишет:

... Просто ошибся если САМ вводивший. Или передумал...

Всё равно нужны какие-то критерии.
В качестве примера могу предложить вариант, где в качестве верных рассматриваются только целочисленные не отрицательные значения.
Ситуация, когда пользователь передумал, моделируется вводом в качестве значения одних пробелов или полным отсутствием значения.


Set objFile = objFSO.OpenTextFile("File.ini", ForReading)
strText = objFile.ReadAll
objFile.Close
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.IgnoreCase = True
objRegExp.Pattern = "max\s*=\s*-*\d+"
Set objMatches = objRegExp.Execute(strText)
strTemp = objMatches.Item(0)
objRegExp.Pattern = "\d+"
Set objMatches = objRegExp.Execute(strTemp)
strTemp = objMatches.Item(0)
blnRepeat = True
Do
	UserName = Trim(InputBox("Ля-ля-ля",,strTemp))
	If Len(UserName) = 0 Then
		WScript.Quit 0
	Else
		objRegExp.Global = True
		objRegExp.Pattern = "\d"
		If Len(UserName) = objRegExp.Execute(UserName).Count Then blnRepeat = False
	End If
Loop While blnRepeat
objRegExp.Global = False
objRegExp.Pattern = "max\s*=\s*-*\d+"
strNewText = objRegExp.Replace(strText, "max = " & UserName)
Set objFile = objFSO.OpenTextFile("File.ini", ForWriting)
objFile.WriteLine strNewText
objFile.Close
_D_V_S_ пишет:

... Я вывожу MSGBOX в конце скрипта с перечнем вновь введённых значений.
Неплохо-б было следующим MSGBOX-ом предложить пере-ввести заново значения...

Пробуйте реализовать самостоятельно.
Не обижайтесь, но Ваша задача не представляет собой чего-либо интересного, поэтому писать сценарий за Вас, вероятнее всего, никому не захочется.

7

Re: VBS: поиск в тексте и вывод на экран

Спасибо !

Задача, согласен, рядовая.
Но дело в том, что в сети практически нет нормальной литературы по изучению языка... И вот эти простые на Ваш взгляд примеры решения рядовых задач - это получше всех .pdf-ов, что я нашёл в сети. И, я думаю, не только одному мне интересны и полезны :-)

Я свой скрипт писал именно по таким примерам, которых - крохи на форумах. И их так мало потому, что знающие люди думают, что это - семечки :-)

Ещё раз - спасибо.

8

Re: VBS: поиск в тексте и вывод на экран

У меня не работает на месте

strTemp = objMatches.Item(0)

9

Re: VBS: поиск в тексте и вывод на экран

Random228007, упакуйте Ваш исходный текстовый файл и Ваш скрипт в архив. Выложите на вменяемый обменник или облако. Ссылку — сюда. Посмотрим.

10 (изменено: Random228007, 2019-09-30 17:24:16)

Re: VBS: поиск в тексте и вывод на экран

alexii

Не работает ни один из ваших кодов на этой странице. Наверно они незавершенные.
Можете сказать что неправильно. Вроде бы все так.

Set FSO = CreateObject("Scripting.FileSystemObject")

if FSO.FileExists("1.txt") Then

Set ts = FSO.OpenTextFile("1.txt", 2, false) 'открыть

else

Set ts = FSO.CreateTextFile("1.txt", 2, false) 'создать

end if

'извлечение из файла

'set readname = Split(whole_line, "Name: ")(1)
'set readpass = Split(whole_line, "Pass: ")(1)

'добавляет переменные name1 и pass1
name1 = inputbox ("Name:","База данных",readname)
pass1 = inputbox ("Pass:","База данных",readpass)
'записывание переменных в файл
ts.WriteLine("Name: " &name1)
ts.WriteLine("Pass: " &pass1)

Мне надо извлечь значения после "Name: " и "Pass: ", но не знаю как это выполнить так, чтобы создавался файл "1.txt" при его отсутствии, но не создавался в присутствии. Чтобы значения извлеклись и были записаны в переменную в inputbox.

11

Re: VBS: поиск в тексте и вывод на экран

Random228007, тогда давайте начнём с формулировки полного техзадания. Именно техзадания, а не уже выбранного Вами способа решения.

12 (изменено: Random228007, 2019-10-01 05:46:54)

Re: VBS: поиск в тексте и вывод на экран

alexii

Нужно создать файл baza.txt, если его нет. Если есть, то нужно прочитать его и найти там 2 строки "Name: " и "Pass: ", если они есть. Если нет, то создать их с пустыми значениями те "Name: " и "Pass: ". Потом нужно эти значения добавить в переменные в inputbox, чтобы изменить их. Если я отменю редактирование, те нажму отмена или введу пустое значение, то они остануться в файле нетронутыми.


Аналог в bat:

@echo off
rem Нужны русские слова
SetLocal EnableExtensions EnableDelayedExpansion
rem Chcp 866 >nul
title %~dp0
cd /d "%~dp0"

cls

if not exist Baza.txt (
	echo Не найден файл "Baza.txt"
	echo.
	echo Создание "Baza.txt" с пустым значением
	echo.

	echo Ssid:> Baza.txt
	echo Pass:>> Baza.txt
)

for /f "tokens=1,2" %%a in (Baza.txt) do (
    if /i "%%a"=="Pass:" set pass=%%b
    if /i "%%a"=="Ssid:" set name=%%b
)




:1

echo Прошлое имя: %name%
echo.


set /p newname=Новое имя: 

echo %newname%|>nul findstr /rc:"^[A-Z0-9a-z][A-Z0-9a-z]*$" && (
echo.
) || (
echo.
echo Недопустимый символ
echo.
) && (
goto 1)

:2

echo Прошлый пароль: %pass%
echo.

set /p newpass=Новый пароль: 

echo %newpass%|>nul findstr /rc:"^[A-Z0-9a-z][A-Z0-9a-z]*$" && (
echo.
) || (
echo.
echo Недопустимый символ
echo.
) && (
goto 2)




if not "%newname%"=="" set name=%newname%
if not "%newpass%"=="" set pass=%newpass%
copy /y Baza.txt Baza.txt.bak
echo Ssid: %name%> Baza.txt
echo Pass: %pass%>> Baza.txt

pause
exit /B

13

Re: VBS: поиск в тексте и вывод на экран

Random228007, ясно. Но сделаем немного не так.

Пробуйте:

Option Explicit

Dim strSourceFile

Dim objFSO
Dim strContent

Dim strNameValue
Dim strPasswordValue


strSourceFile = "baza.txt"


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

If objFSO.FileExists(strSourceFile) Then
	With objFSO.OpenTextFile(strSourceFile)
		strContent = .ReadAll()
		.Close
	End With
	
	strNameValue     = GetValue(strContent, "Name")
	strPasswordValue = GetValue(strContent, "Pass")
	
	strNameValue     = Trim(InputBox("Enter name:",     "Enter name",     strNameValue))
	strPasswordValue = Trim(InputBox("Enter password:", "Enter password", strPasswordValue))
	
	If Len(strNameValue) > 0 Then
		strContent = SetValue(strContent, "Name", strNameValue)
	End If
	
	If Len(strPasswordValue) > 0 Then
		strContent = SetValue(strContent, "Pass", strPasswordValue)
	End If
	
	With objFSO.CreateTextFile(strSourceFile, True)
		.Write strContent
		.Close
	End With
Else
	WScript.Echo "Can't find source file [" & strSourceFile & "]."
	WScript.Quit 2
End If

Set objFSO = Nothing

WScript.Quit 0
'-----------------------------------------------------------------------------

'-----------------------------------------------------------------------------
Function GetValue(strContent, strParameter)
	With WScript.CreateObject("VBScript.RegExp")
		.IgnoreCase = True
		.MultiLine  = True
		
		.Pattern = "^\s*" & strParameter & ":(.*?)$"
		
		If .Test(strContent) Then
			GetValue = .Execute(strContent).Item(0).Submatches.Item(0)
		Else
			WScript.Echo "Can't find parameter [" & strParameter & "] in source file [" & strSourceFile & "]."
			GetValue = ""
		End If
	End With
End Function
'-----------------------------------------------------------------------------

'-----------------------------------------------------------------------------
Function SetValue(strContent, strParameter, strValue)
	With WScript.CreateObject("VBScript.RegExp")
		.IgnoreCase = True
		.MultiLine  = True
		
		.Pattern = "^\s*" & strParameter & ":.*?$"
		
		If .Test(strContent) Then
			SetValue = .Replace(strContent, strParameter & ":" & strValue)
		Else
			SetValue = strContent & vbCrLf & strParameter & ":" & strValue
		End If
	End With
End Function
'-----------------------------------------------------------------------------

14

Re: VBS: поиск в тексте и вывод на экран

alexii

Спасибо, получилось. Я внес свои некоторые изменения:

Option Explicit

Dim strSourceFile

Dim objFSO
Dim strContent

Dim strNameValue
Dim strPasswordValue


strSourceFile = "baza.txt"


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

If objFSO.FileExists(strSourceFile) Then
	With objFSO.OpenTextFile(strSourceFile)
		strContent = .ReadAll()
		.Close
	End With
	
	strNameValue     = GetValue(strContent, "Name")
	strPasswordValue = GetValue(strContent, "Pass")
	
	strNameValue     = Trim(InputBox("Enter name:",     "Enter name",     strNameValue))
	strPasswordValue = Trim(InputBox("Enter password:", "Enter password", strPasswordValue))
	
	If Len(strNameValue) > 0 Then
		strContent = SetValue(strContent, "Name", strNameValue)
	End If
	
	If Len(strPasswordValue) > 0 Then
		strContent = SetValue(strContent, "Pass", strPasswordValue)
	End If
	
	With objFSO.CreateTextFile(strSourceFile, True)
		.Write strContent
		.Close
	End With
Else
	WScript.Echo "Can't find source file [" & strSourceFile & "]."
	Set ts = objFSO.CreateTextFile("baza.txt", 2, false)
	ts.WriteLine("Name: ")
	ts.WriteLine("Pass: ")
	WScript.Quit 2
End If

Set objFSO = Nothing

WScript.Quit 0
'-----------------------------------------------------------------------------

'-----------------------------------------------------------------------------
Function GetValue(strContent, strParameter)
	With WScript.CreateObject("VBScript.RegExp")
		.IgnoreCase = True
		.MultiLine  = True
		
		.Pattern = "^\s*" & strParameter & ": (.*?)$"
		
		If .Test(strContent) Then
			GetValue = .Execute(strContent).Item(0).Submatches.Item(0)
		Else
			WScript.Echo "Can't find parameter [" & strParameter & "] in source file [" & strSourceFile & "]."
			GetValue = ""
		End If
	End With
End Function
'-----------------------------------------------------------------------------

'-----------------------------------------------------------------------------
Function SetValue(strContent, strParameter, strValue)
	With WScript.CreateObject("VBScript.RegExp")
		.IgnoreCase = True
		.MultiLine  = True
		
		.Pattern = "^\s*" & strParameter & ": .*?$"
		
		If .Test(strContent) Then
			SetValue = .Replace(strContent, strParameter & ": " & strValue)
		Else
			SetValue = strContent & vbCrLf & strParameter & ": " & strValue
		End If
	End With
End Function
'-----------------------------------------------------------------------------