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

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

ultrarare 03-07-2013 05:29 2178430

Поиск строки по маске в txt файле и замена всей строки из InputBox
 
Здравствуйте.
Помогите с изменением строки в txt файле

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

Iska 03-07-2013 07:12 2178440

Цитата:

Цитата ultrarare
Имеется файл list.txt, »

Упакуйте файл в архив. Выложите сюда или на RGhost.

ultrarare 03-07-2013 07:23 2178443

Вложений: 1
Сделано, спасибо за внимание к теме :)

Iska 03-07-2013 08:07 2178451

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 2178459

Простите, каюсь, забыл упомянуть, вместо 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 2178484

Цитата:

Цитата ultrarare
забыл упомянуть, вместо ip ещё можно и нужно вводить домены типа myproxy.freeproxy.net или р72345.myproxy.freeproxy.net »

Ясно.

Цитата:

Цитата ultrarare
И не могли бы вы добавить в конце запуск файла при нажатии кнопки 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



Цитата:

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

Так и есть.

ultrarare 03-07-2013 09:38 2178494

Премного благодарен, всё работает :clapping:

ultrarare 03-07-2013 11:36 2178559

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

Iska 03-07-2013 11:57 2178573

Цитата:

Цитата ultrarare
Можно ли явно указать кодировку ANSI выходному файлу list.txt? Даже не могу понять в какой кодировке он сохраняется. »

Можно. Но не нужно:

читать дальше »




Она и так будет ANSI по умолчанию — OpenTextFile Method:
Цитата:


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.



Цитата:

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

Верно.

Цитата:

Цитата ultrarare
сейчас изменил на .whs (полагаю, что так нужно) »

Не нужно. «*.wsh» — достаточно бесполезный файл описания сценария.

ultrarare 03-07-2013 12:06 2178580

Большое спасибо за объяснения :)

Iska 03-07-2013 14:02 2178638

Из письма в PM:
читать дальше »
Цитата:

Цитата:

Цитата ultrarare
В очередной раз прошу прощения за беспокойство, в теме уже как то неудобно спрашивать, но если вы посчитаете нужным, продублирую и в тему
Моя проблема с кодировками (или подозрением на них) была замечена визуально, я всегда открывал файл 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 2178654

Цитата:

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

Дурная голова, рукам покоя не даёт :D

Цитата:

Цитата Iska
«TristateTrue» — это юникод . »

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

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


Время: 16:39.

Время: 16:39.
© OSzone.net 2001-