1

Тема: VBS: Как найти подстроку в тхт файле?

Скрипт не может найти подстроку, я уже не знаю что делать:

Содержимое backup01.log

aaaaaaaaaaaaaaaaaaaaaaaaaa

sssssssssssssssssssssssssss

ddddddddddddddddddddddddddd

fffffffffffffffffffffffffff

gggggggggggggggggggggggggggg

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

Содержимое Terms.txt

a
h
f

Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("E:\Other\TEST\backup01.log", ForReading)

strContents = objFile.ReadAll
objFile.Close

Set objFile = objFSO.OpenTextFile("E:\Other\TEST\Terms.txt", ForReading)

strSearchTerms = objFile.ReadAll
objFile.Close

arrSearchTerms = Split(strSearchTerms, vbCrLf)

For Each strItem in arrSearchTerms
    intFound = InStr(strContents,strItem)
    If intFound > 0 Then
        Wscript.Echo "The search term " & strItem & " was found."
    End If
Next

так вот скрипт выдает вот что:

The search term  was found.
The search term a was found.
The search term h was found.

Почему не находит f ????

МОжет есть простой и надежный пример, как найти например в текстовом файле слово?

2

Re: VBS: Как найти подстроку в тхт файле?

Вот что Ваш скрипт выдаёт у меня:

The search term a was found.
The search term h was found.
The search term f was found.

OFF: Безотносительно к изложенному скрипту: лучший метод для подобных вещей — использование регулярных выражений (RegExp), хотя, как правило, пока это заработает — семь потов сойдёт .

3

Re: VBS: Как найти подстроку в тхт файле?

возможно у вас другая кодировка
А где предусмотреть Юникод, UTF, ANSI ?

4

Re: VBS: Как найти подстроку в тхт файле?

LL пишет:

А где предусмотреть Юникод, UTF, ANSI ?

http://www.script-coding.com/WSH/FileSy … html#3.24.

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

5

Re: VBS: Как найти подстроку в тхт файле?

LL пишет:

возможно у вас другая кодировка

Поскольку прямых указаний на то не было, я использовал ANSI (Win-1251).

6

Re: VBS: Как найти подстроку в тхт файле?

Спасибо, я проверил параметр format - objFSO.OpenTextFile("E:\Other\TEST\Terms.txt", ForReading,TristateFalse)
но все равно выдает теперь, что нашел, но в таком виде
The search term  was found.
The search term  was found.
The search term  was found.

В общем для моей задачи, достаточно чтобы просто нашло, не важно уже выводится или нет, но на будущее хотелось бы раз и навсегда понять почему
файл с кодировкой Юникод открыватеся иероглифами при указании открывать как ANSY?

7

Re: VBS: Как найти подстроку в тхт файле?

А что удивительного в том, что "файл с кодировкой Юникод открыватеся иероглифами при указании открывать как ANSY"?
И кстати, ты работаешь с двумя файлами, каждый из которых имеет какую-то кодировку.

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

8

Re: VBS: Как найти подстроку в тхт файле?

alexii пишет:

лучший метод для подобных вещей — использование регулярных выражений (RegExp), хотя, как правило, пока это заработает — семь потов сойдёт .

С первым согласен.
На мой взгляд, ничего более эффективного для работы со строками чем RegExp пока не придумано.

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

Готов консультировать по составлению регекспов
(только примеры буду приводить на JS, ввиду кривоватой формы записи регекспов в VBS)

9 (изменено: alexii, 2008-06-17 23:24:43)

Re: VBS: Как найти подстроку в тхт файле?

OFF:

fps пишет:

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

Мне каждый раз приходится заново читать справку . Правда, и работаю я с ним раз в сто лет.

fps пишет:

…ввиду кривоватой формы записи регекспов в VBS

В чём это выражается, можете пояснить [не в качестве холивара, — просто я не теряю надежды приобщиться и к js]?

P.S. Может быть, Вы имеете ввиду работу через отдельный объект?

10

Re: VBS: Как найти подстроку в тхт файле?

alexii пишет:

В чём это выражается, можете пояснить [не в качестве холивара, — просто я не теряю надежды приобщиться и к js]?

В отсутствии сокращенной формы записи регекспов - /pattern/

JS:
var x="xxyyzz".match(/(y+)/i)[1];    // вернет "yy"

сколько строк это займет на VBS?

11 (изменено: LL, 2008-06-18 18:05:17)

Re: VBS: Как найти подстроку в тхт файле?

можно пример с регекспов - поиск в текстовом файле любого из слов
"Ошибка", "Не удалось", "не" ?

вот такой код:

On Error Resume Next
Const ForReading = 1

Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "не удалось"
objRegExp.Global = True

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Folder = FSO.GetFolder("C:\Documents and Settings\Администратор\Local Settings\Application Data\Microsoft\Windows NT\NTBackup\data")
For each objFile in Folder.Files
WScript.Echo objFile.Name ' вывести имена файлов

Set File = FSO.GetFile(Folder.Path & "\" & objFile.Name)
Set TextStream = File.OpenAsTextStream(1)
strContents = TextStream.ReadAll() '- И ПОЧЕМУ ЗДЕСЬ ОШИБКУ ВЫДАЕТ: Ошибка выполнения Microsoft VBScript: Ввод данных за пределами файла?
TextStream.Close


Str = strContents
WScript.Echo str
Set objMatches = objRegExp.Execute(Str)
For i=0 To objMatches.Count-1
    Set objMatch = objMatches.Item(i)
    'найденное значение (подстрока)
    'индекс первого символа найденной подстроки в строке-оригинале
    'длина найденной подстроки
    'WScript.Echo objMatch.Value & ", " & "FirstIndex=" & objMatch.FirstIndex & ", " & "Length=" & objMatch.Length
     WScript.Echo objMatch.Value
Next

Next


В папке "C:\Documents and Settings\Администратор\Local Settings\Application Data\Microsoft\Windows NT\NTBackup\data" лежит
три файла backup01.log,backup02.log,backup03.log - только в одном файле backup03.log есть строка "Операцию завершить не удалось"

Почему у меня на экране в результате запуска скрипта выдается это?

backup01.log

backup02.log
яю↕♦K♦?♦>♦;♦=♦5♦=♦8♦5♦
backup03.log
яю↕♦K♦?♦>♦;♦=♦5♦=♦8♦5♦

12 (изменено: fps, 2008-06-18 20:57:42)

Re: VBS: Как найти подстроку в тхт файле?

> можно пример с регекспов - поиск в текстовом файле любого из слов "Ошибка", "Не удалось", "не" ?

Пожалуйста: /Ошибка|Не удалось|не/
А если регистр символов не важен, то можно и так: /Ошибка|Не/i
("не удалось" включает в себя "не" и отдельно искать его необходимости нет)
Причем, думаю, ты на самом деле хочешь найти не то, что просишь.
Поиск "не" сработает, например, на строке содержещей слово "выполнено".
Если тебе нужно именно предлог "не", то в регекспе не забудь пробел после него:  /Ошибка|Не удалось|не /


Хотя в данном случае проблемы не в регекспах:

> TextStream.ReadAll() '- И ПОЧЕМУ ЗДЕСЬ ОШИБКУ ВЫДАЕТ: Ошибка выполнения Microsoft VBScript: Ввод данных за пределами файла?

Потому что файл нулевой длины.
Нужно сначала проверить, что размер файла больше нуля.

> Почему у меня на экране в результате запуска скрипта выдается это?
яю↕♦K♦?♦>♦;♦=♦5♦=♦8♦5♦

Потому что файл в кодировке UNICODE, но ты не указываешь соответствующей опции, когда его открываешь, и он считывается как ANSI

13

Re: VBS: Как найти подстроку в тхт файле?

спасибо за символ | - в регеспе помог мне , а также спос, что подсказали что нужно при открытии файла учитвать его опции

14

Re: VBS: Как найти подстроку в тхт файле?

Доброго всем. Небольшой вопросик по скрипту имеется:

Этот скрипт  находит в файле 1203.txt слова которые я забил в файл terms.txt.
Но вот незадача, нужно указывать точное имя файла v:\post\1203.txt. А как бы сделать по маске??? Например v:\post\*.txt ?????
Вот код

 Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("v:\post\1203.txt", ForReading)
 
strContents = objFile.ReadAll
objFile.Close
 
Set objFile = objFSO.OpenTextFile("c:\Terms.txt", ForReading)
strSearchTerms = objFile.ReadAll
objFile.Close
 
arrSearchTerms = Split(strSearchTerms, vbCrLf)
 
For Each strItem in arrSearchTerms
    intFound = InStr(strContents,strItem)
    If intFound > 0 Then
        Wscript.Echo "У тебя  " & strItem & "ошибка."
    End If
Next

Спасибо всем за помощь.

15

Re: VBS: Как найти подстроку в тхт файле?

Перебирать файлы в цикле. Например, таким способом:
http://www.script-coding.com/SCI_WSC.html#WalkFilesEx

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

16

Re: VBS: Как найти подстроку в тхт файле?

Люди, подскажи пожалуйста кусок кода. Задача.
Я через Handle.exe узнаю PID процесса, который блокирует файл от удаления. и сохраняю это в текстовый файл.

Handle v3.42
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

1cv7.exe           pid: 3728     18: D:\copy\comp\1Cv7.LCK

как мне в VBS выцыпить PID? что бы можно было убить процесс.

17

Re: VBS: Как найти подстроку в тхт файле?

lawyerly
Создавайте пожалуйста для новых вопросов новые темы. То что вопросов много никого не смутит. А вот обсуждение в одной ветке множества тем - это плохо для повторного использования.