В мире Linux/Unix для поиска определенного текста или ошибок в лог файлах используется команда grep. Grep позволяет быстро и удобно найти/выбрать любых данные из результатов выполнения другой команды:
command | grep search
В PowerShell для поиска текста в файлах можно использовать командлет Select-String.
Например, следующая команда выведет все строки текстового файла, содержащие ключевую фразу ERROR:
Select-String -Path c:\tmp\makeapp_sxtracesxs.txt -Pattern "ERROR"
Команда вывела номера строк, в которых содержится искомый тескт и их содержимое.
Если вам нужно выполнить поиск вхождения строки по всем txt файлам в определенном каталоге, выполните команду:
Select-String -Path c:\tmp\*.txt -Pattern "ERROR"
Такую команду удоно исопльзовать, если нужно выполнить поиск по всем файлам в каталоге. Например, для поиска в транспортных логах/smtp Exchange.
С помощью опций Exclude/Include можно включить, исключить определенннные файлы для поиска. Следующий пример выполнит поиск по всем txt и log файлам, имя которых не содежит copy:
$path = "c:\tmp\*"
Select-String -Path $path -Pattern "ERROR" -Include "*.txt","*.log" -Exclude "*copy*"
Предудущий пример выполняет поиск текста только в указанном каталоге. Для рекурсивного поиска по файлам во вложенных каталогах используйте Get-ChildItem:
Get-ChildItem -Path 'c:\tmp\' -Recurse -include "*.mp3","*.avi" -ErrorAction SilentlyContinue | Select-String -SimpleMatch "ERROR","WARNING"
Это далеко не grep, это фильтр по полю/заголовку, а не по строке ответа.
Есть windows утилита findstr называется
А про select-string забыли?
через 10 лет рабочее решение найдено)))
Get-Process -IncludeUserName | findstr -i 964
Что не отменяет его кривизны.
Get-ChildItem -path «D:\*.txt»,»*.xlsx»,»*.docx» -Recurse |? { $_.FullName -notmatch ‘Text papka’ }| Select-String -Pattern «qazwsxedc» | Select-Object -ExpandProperty Path почему-то этот скрипт видит txt файл, но не может проверить файлы xlsx и docx, что не так, заранее спаси
xlsx и docx файл в сыром виде не содержат этот текст, поэтому грепать их так не имеет смысла (там используется другой формат хранения)
Select-String будет искать только текстовое вхождение искомой строки в файл (как в обычных плоских txt/csv файлах)
Если да, то можете ли вы дать мне решение для поиска нужного слова среди офисных файлов
Как вариант, открывать каждый файл xlsx файл через New-Object -ComObject Excel.Application или docx через New-Object –comobject Word.Application
Но что-то мне кажется что поиск хотя бы по пару десятку файлов будет ооочень медленным.
Вот тут пример есть:
_https://stackoverflow.com/questions/43838082/how-to-search-a-word-in-a-docx-file-with-powershell
#Instance of word
$Word=NEW-Object –comobject Word.Application
$Word.visible = $False
#take list of .docx
Get-ChildItem "c:\temp" -file -Filter "*.docx" | %{
$Filename=$_.FullName
#open file and take content of word file
$Document=$Word.documents.open($Filename, $false, $true)
$range = $document.content
#if content have your word, print path of word file
If($range.Text -like "*tot*"){
$Filename
}
$word.Documents.Close($false)
}
Этот скрипт предназначен только для файлов документов word. У вас есть скрипты, которые ищут слова в файлах Excel Word? Я не смог найти их в Google
https://dngrep.github.io/ Лучшая программа для поиска слов, но мне нужен скрипт, а не программа
Я вам выше показал кусок кода для поиска в Word (на компьютере должен стоять MS Office Word и Excel).
Найдите аналогичный для excel и сделайте две функции — для поиска в разных типов файлов.
$path = «D:\test»
$files = Get-Childitem $path -Include *.docx,*.doc,*.txt,*.pdf,*.docm,*.dot,*.dotx,*.rtf,*.xml,*.csv,*.xls,*.xlsx -Recurse | Where-Object { !($_.psiscontainer) }
$application = New-Object -comobject word.application
$application.visible = $False
$findtext = «qazwsxedc» #regex
Function getStringMatch
{
Foreach ($file In $files) {
$document = $application.documents.open($file.FullName,$false,$true)
$arrContents = $document.content.text.split()
$varCounter = 0
ForEach ($line in $arrContents) {
$varCounter++
If($line -match $findtext) {
«$file»
}
}
$document.close()
}
$application.quit() }
getStringMatch
с помощью этого скрипта вы сможете найти нужное слово среди файлов всех форматов
👍Отлично, что разобрались. Хотя мне удивительно, что объект word.application может искать по всем типам файлам
Сомневаюсь что отработает по RTF.
проверьте, у меня сработало
Проверил, через word.application как по сути в Word загрузить все файлы. Ексель ему не подошел).