В мире 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 загрузить все файлы. Ексель ему не подошел).
Здравствуйте! Есть файл .csv в нём 2 поля- имя хоста и кто за ним закреплён. Есть цикл который пробегается по всем этим компам и выводит определённую информацию. Нужно туда ещё впихнуть имя, кто сидит за этим компом.Можете подсказать как это сделать с помощью хэш таблицы? foreach($user in $computers){Invoke-Command -ComputerName $user -ScriptBlock { $env:computername; …}
Как я понял, вы не поймете как отправить переменную с вашего компьютера в удаленну команду. В этом случае можно обратиться к внешней переменной с помощью конструкции
$using:По логике должно быть что то вида:
$Computers=Import-CSV -path C:\PS\comps.csv
ForEach ($PC in $Computers){
Invoke-Command -ComputerName $PC.CompName -ScriptBlock {$using.PC.username | Out-File c:\temp\user.txt }
}
Import-CSV: https://winitpro.ru/index.php/2022/10/13/import-csv-fajlov-v-powershell/
Invoke-Command: https://winitpro.ru/index.php/2020/07/27/powershell-invoke-command-zapuska-komand-na-udalennyx-kompyuterax/
Подскажите, а есть возможность в дополнение к найденной строке с искомым словом, вывести следующие несколько строк, допустим +2 строки ниже или выше?
Для этого используется параметр -Context . Например, такая команда вернент 3 строки до и три после найденного паттерна:
Select-String -Path c:\tmp\makeapp_sxtracesxs.txt -Pattern "ERROR" -Context 3, 3Как вывести только найденное слово, без лишней информации ?
Запрос: Select-string -Path .\ -Pattern file.txt
На выходе чтобы было только file.txt
Select-String -Path "C:\PS\*" -Pattern 'file.txt' -ErrorAction SilentlyContinue| ForEach-Object {$_.Path , $_.Matches.Value}Нашёл пример:
$Name = ‘Вася’
$Surname = ‘Иванов’
‘Меня зовут ‘ + $Name + ‘, а фамилия моя ‘ + $Surname
Можете объяснить что тут «+» делает, в обоих случаях ?
Плюсом склеиваются строки и содержимое переменных
в данном случае это конкатенация строк. но если надо вывести в консоли лучше использовать
write-host "Меня зовут $($Name), а фамилия моя $($Surname)"