Войти

Показать полную графическую версию : [решено] Поиск строки по маске в txt файле и замена всей строки из InputBox


ultrarare
03-07-2013, 05:29
Здравствуйте.
Помогите с изменением строки в txt файле

Имеется файл list.txt, нужно найти в нём строку начинающуюся с "ProxyS=тут ip адрес" и заменить на введённые данные из InputBox (ip),
фактически всю строку менять не нужно, просто нужно подставить введённый в InputBox ip
и если такое возможно то было бы очень полезно, в строке ввода InputBox'а отображать текущий ip который уже был прописан в "ProxyS=тут ip адрес"
то есть оставить данный ip и при нажатии кнопки "Ok" ip не поменялся на пустое значение.
и затем запустить программу в той же директории (.exe)
если не затруднит, то было бы восхитительно при нажатии кнопки "Отмена" просто завершить скрипт без запуска программы.

Iska
03-07-2013, 07:12
Имеется файл list.txt, »
Упакуйте файл в архив. Выложите сюда или на RGhost.

ultrarare
03-07-2013, 07:23
Сделано, спасибо за внимание к теме :)

Iska
03-07-2013, 08:07
ultrarare, на WSH:
Option Explicit

Const ForReading = 1
Const ForWriting = 2


Dim strFile
Dim strPattern

Dim objFSO

Dim strProxyS
Dim strContent


strFile = "E:\Песочница\0288\list.txt"

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

If objFSO.FileExists(strFile) Then
With objFSO.OpenTextFile(strFile, ForReading)
strContent = .ReadAll()
.Close
End With

With WScript.CreateObject("VBScript.RegExp")
.Pattern = "^(ProxyS=)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$"
.IgnoreCase = True
.MultiLine = True

If .Test(strContent) Then
strProxyS = Trim(InputBox("Change ProxyS value:", "ProxyS", .Execute(strContent).Item(0).Submatches(1)))

If Len(strProxyS) > 0 Then
strContent = .Replace(strContent, "$1" & strProxyS)

With objFSO.OpenTextFile(strFile, ForWriting)
.Write strContent
.Close
End With
End If
Else
WScript.Echo "Can't find any line in file [" & strFile & "] for pattern [" & .Pattern & "]."
End If
End With
Else
WScript.Echo "Can't find file [" & strFile & "]."
End If

WScript.Quit 0

Проверка — является ли введённое значение IP-адресом — не производится.

ultrarare
03-07-2013, 08:26
Простите, каюсь, забыл упомянуть, вместо ip ещё можно и нужно вводить домены типа myproxy.freeproxy.net или р72345.myproxy.freeproxy.net - сейчас не получается.
И не могли бы вы добавить в конце запуск файла при нажатии кнопки ok и просто завершение скрипта по нажатию кнопки отмена, без запуска .exe, если конечно возможно.

PS уточню, в форме ввода InputBox'a можно написать myproxy.freeproxy.net и он изменится в файле, но при следующем запуске скрипт не находит строку по указанному шаблону.
PSPS можно ещё каким то образом управлять кодировкой файла list.txt? наверное ANSI, совсем забыл про кириллические домены :)

Iska
03-07-2013, 09:29
забыл упомянуть, вместо ip ещё можно и нужно вводить домены типа myproxy.freeproxy.net или р72345.myproxy.freeproxy.net »
Ясно.

И не могли бы вы добавить в конце запуск файла при нажатии кнопки ok »
Какого файла?

Пусть будет «Блокнот»:
Option Explicit

Const ForReading = 1
Const ForWriting = 2


Dim strFile
Dim strFile4Execute
Dim strPattern

Dim objFSO

Dim strProxyS
Dim strContent


strFile = "E:\Песочница\0288\list.txt"
strFile4Execute = "c:\Windows\notepad.exe"

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

If objFSO.FileExists(strFile) Then
With objFSO.OpenTextFile(strFile, ForReading)
strContent = .ReadAll()
.Close
End With

With WScript.CreateObject("VBScript.RegExp")
.Pattern = "^(ProxyS=)(.*)$"
.IgnoreCase = True
.MultiLine = True

If .Test(strContent) Then
strProxyS = Trim(InputBox("Change ProxyS value:", "ProxyS", .Execute(strContent).Item(0).Submatches(1)))

If Len(strProxyS) > 0 Then
strContent = .Replace(strContent, "$1" & strProxyS)

With objFSO.OpenTextFile(strFile, ForWriting)
.Write strContent
.Close
End With

If objFSO.FileExists(strFile4Execute) Then
WScript.CreateObject("WScript.Shell").Run """" & strFile4Execute & """", 1, False
End If
End If
Else
WScript.Echo "Can't find any line in file [" & strFile & "] for pattern [" & .Pattern & "]."
End If
End With
Else
WScript.Echo "Can't find file [" & strFile & "]."
End If

WScript.Quit 0


можно ещё каким то образом управлять кодировкой файла list.txt? наверное ANSI, совсем забыл про кириллические домены »
Так и есть.

ultrarare
03-07-2013, 09:38
Премного благодарен, всё работает :clapping:

ultrarare
03-07-2013, 11:36
Iska, не тут то было, в попыхах проверил, всё работает, сейчас пристальнее присмотрелся, выявил несколько проблем, не могли бы вы мне ещё немного помочь?
Можно ли явно указать кодировку ANSI выходному файлу list.txt? Даже не могу понять в какой кодировке он сохраняется.
Когда я первый раз запускал, так и оставил расширение .vbs, сейчас изменил на .whs (полагаю, что так нужно) при запуске отображается ошибка с сообщением "Сценарий не указан" я, что то не так делаю?

Iska
03-07-2013, 11:57
Можно ли явно указать кодировку ANSI выходному файлу list.txt? Даже не могу понять в какой кодировке он сохраняется. »
Можно. Но не нужно:

http://img822.imageshack.us/img822/7204/w5es.png

http://img189.imageshack.us/img189/7093/l60w.png

Она и так будет ANSI по умолчанию — OpenTextFile Method (http://msdn.microsoft.com/en-us/library/314cz14s(v=vs.84).aspx):

format

Optional. One of three Tristate values used to indicate the format of the opened file (TristateTrue = -1 to open the file as Unicode, TristateFalse = 0 to open the file as ASCII, TristateUseDefault = -2 to open the file as the system default). If omitted, the file is opened as ASCII.


Когда я первый раз запускал, так и оставил расширение .vbs »
Верно.

сейчас изменил на .whs (полагаю, что так нужно) »
Не нужно. «*.wsh» — достаточно бесполезный файл описания сценария.

ultrarare
03-07-2013, 12:06
Большое спасибо за объяснения :)

Iska
03-07-2013, 14:02
Из письма в PM:
В очередной раз прошу прощения за беспокойство, в теме уже как то неудобно спрашивать, но если вы посчитаете нужным, продублирую и в тему
Моя проблема с кодировками (или подозрением на них) была замечена визуально, я всегда открывал файл list.txt notepad++'ом (отображалось всё нормально), как то так получилось - открыл блокнотом, следующая строка наползла на изменяемую:
[CONF]
Proxy=true
ProxyS=127.0.0.1ProxyP=8080
Из этого следует, что после ProxyS=127.0.0.1 что то есть ("-вы видите суслика? -нет. -и я не вижу, но он есть...")
Полагаю проблема всё же в кодировке, поправьте если не в ту сторону думаю.
И ещё, не могли бы вы подставить кавычки (""), чтобы получилось ProxyS="127.0.0.1"
Пробовал изменить кодировку методом тыка (опираясь на приведённую вами ссылку http://msdn.microsoft.com/en-us/libr...v=vs.84).aspx), но помоему у меня ничего не вышло...
Была добавлена константа Const TristateTrue = -1
И далее добавлена в строку With objFSO.OpenTextFile(strFile, ForReading, TristateTrue)
Изменений не увидел, решил не тупить и написать вам ещё раз.
Уже плевать на кириллические домены, хоть бы латиница работала(

Как я только что выяснил, конец строки для RegExp из VBScript — это Lf, а не CrLf. Отсюда и кажущаяся склейка (Ваш редактор не видит первого из символов конца строки и потому не считает данную позицию концом строки). Попробуйте иначе:
Option Explicit

Const ForReading = 1
Const ForWriting = 2


Dim strFile
Dim strFile4Execute
Dim strPattern

Dim objFSO

Dim strProxyS
Dim strContent


strFile = "E:\Песочница\0288\list.txt"
strFile4Execute = "c:\Windows\notepad.exe"

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

If objFSO.FileExists(strFile) Then
With objFSO.OpenTextFile(strFile, ForReading)
strContent = .ReadAll()
.Close
End With

With WScript.CreateObject("VBScript.RegExp")
.Pattern = "(\r\nProxyS=)(.*)(\r\n)"
.IgnoreCase = True
.Global = True

If .Test(strContent) Then
strProxyS = Trim(InputBox("Change ProxyS value:", "ProxyS", .Execute(strContent).Item(0).Submatches(1)))

If Len(strProxyS) > 0 Then
strContent = .Replace(strContent, "$1" & strProxyS & "$3")

With objFSO.OpenTextFile(strFile, ForWriting)
.Write strContent
.Close
End With

If objFSO.FileExists(strFile4Execute) Then
WScript.CreateObject("WScript.Shell").Run """" & strFile4Execute & """", 1, False
End If
End If
Else
WScript.Echo "Can't find any line in file [" & strFile & "] for pattern [" & .Pattern & "]."
End If
End With
Else
WScript.Echo "Can't find file [" & strFile & "]."
End If

WScript.Quit 0
А зачем кавычки? Пробелов ведь ни в IP-адресе, ни в доменном имени быть не может.

«TristateTrue» — это юникод ;).

ultrarare
03-07-2013, 14:37
А зачем кавычки? Пробелов ведь ни в IP-адресе, ни в доменном имени быть не может. »
Дурная голова, рукам покоя не даёт :D

«TristateTrue» — это юникод . »
Да я когда этот файл в юникоде сохранял, строка уплывала обратно, вот и пытался экспериментировать)

Большое спасибо вам, надеюсь вопросов более не возникнет :)




© OSzone.net 2001-2012