Как заставить PowerShell искать в документе Word подстановочные знаки и возвращать найденное слово?

Я ищу в очень большом количестве документов Word (5000) очень большое количество строк (3000). Я знаю, как это сделать в сценарии Powershell, но это занимает очень много времени. К счастью, большинство этих строк имеют общий текст в первых 3 или 4 символах, и я могу сузить строки примерно до 300, если использовать поиск с использованием подстановочных знаков в операторе find.execute. Если я ищу (cod) * в strings.txt и нахожу такие результаты, как «код», «кодирование», «закодированные» и т. Д. В документе Word, мне нужно поместить эти результаты в текстовый файл. Однако мне не повезло.

  $ filePath = "C:  files " $ textPath = "C:  strings.txt" $ outputPath = "C  :  output.txt "$ findTexts = (Get-Content $ textPath) $ docs = Get-childitem -path $ filePath -Recurse -Include * .docx $ application = New-Object -comobject word.application Foreach ($ doc in $  docs) {$ document = $ application.documents.open ("$ doc", $ false, $ true) $ application.visible = $ False $ matchCase = $ false $ matchWholeWord = $ false $ matchWildCards = $ true $ matchSoundsLike = $  false $ matchAllWordForms = $ false $ forward = $ true $ wrap = 1 $ range = $ document.content $ null = $ range.movestart () Foreach ($ findtext в $ findTexts) {$ wordFound = $ range.find.execute (  $ findText, $ matchCase, $ matchWholeWord, $ matchWildCards, $ matchSoundsLike, $ matchAllWordForms, $ forward, $ wrap) if ($ wordFound) {$ docName = $ doc.Name # Вывод результатов поиска и имени файла в файл с разделителями табуляции  "$ findText`t $ docName" |  Out-File -append $ outputPath} #end if $ wordFound} #end foreach $ findText $ document.close ()} #end foreach $ doc $ application.quit ()  

Если у меня есть документ Word со словом «кодирование» в нем, в результате этого скрипта будет получен файл output.txt, содержащий подстановочный знак (cod) * и имя файла, потому что $ findText = (cod) *. Так есть ли способ получить слово «кодирование» для вывода в файл?


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

  if ($ document.Content.Text -match " b $ ($ findText)  w +  b") {$ docName = $ doc.Name  "$ ($ соответствует [0])` t $ docName "|  Out-File -append $ outputPath}  


Поиск слова во всем текстовом документе, не открывая его

Я хочу искать слово во всем текстовом документе, не открывая его.

Я ищу на всех сайтах и ​​читаю здесь все вопросы, но при использовании этого кода возникает ошибка (с использованием Объект диапазона )

  object findText = "find me"; Word.Range rng = this.Paragraphs [2] .Range;  rng.Find.ClearFormatting (); if (rng.Find.Execute (ref findText, ref отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка  отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует)) {MessageBox.Show ("Текст найден.");} else {MessageBox.Show ("Текст не найден. ");} rng.Select ();  

Но у меня есть ошибка в

  абзацах [2]  

при открытии большого файла. Ошибка:

ref missing


Вы должны подсчитать количество абзацев во всем документе, используя

  int docc = wordfile.Paragraphs.Count;  

Итак когда вы открываете большие файлы, он будет считать все абзацы в файле. Затем с помощью ((docc)) в коде диапазона

  Range rng = wordfile.Paragraphs [docc].  Range;  

Вторую ошибку вы можете использовать ((Type.Missing)) вместо ((ref missing))

, чтобы код был

  object findText = "найди меня"; int docc = wordfile.Paragraphs.Count; Range rng = wordfile.Paragraphs [docc] .Range; rng.Find.ClearFormatting ();  if (rng.Find.Execute (ref findText, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)  , Type.Missing, Type.Missing, Type.Missing  , Type.Missing)) {MessageBox.Show ("Текст найден.");  } else {MessageBox.Show ("Текст не найден.");} rng.Select ();   

Оцените статью
logicle.ru
Добавить комментарий