Показать полную графическую версию : [решено] Поиск строки по маске в 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)
если не затруднит, то было бы восхитительно при нажатии кнопки "Отмена" просто завершить скрипт без запуска программы.
Имеется файл list.txt, »
Упакуйте файл в архив. Выложите сюда или на RGhost.
ultrarare
03-07-2013, 07:23
Сделано, спасибо за внимание к теме :)
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, совсем забыл про кириллические домены :)
забыл упомянуть, вместо 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 (полагаю, что так нужно) при запуске отображается ошибка с сообщением "Сценарий не указан" я, что то не так делаю?
Можно ли явно указать кодировку 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
Большое спасибо за объяснения :)
Из письма в 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.