В мире 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
Можете объяснить что тут «+» делает, в обоих случаях ?
Плюсом склеиваются строки и содержимое переменных