PowerShell - Поиск через PS по значениям из EXCEL

Аватара пользователя
olmife

PowerShell - Поиск через PS по значениям из EXCEL

Сообщение olmife »

Всем привет. Не специалист в PS, но очень требуется автоматизация и запилил, что смог.

Задача:

Необходимо из EXCEL значения ячейки брать параметры для поиска файлов на диске (значения там периодически разные типа : "ivanov.txt","petrov.txt", "sidorov.txt" и т.д список может быть очень большой), после чего производится поиск определенного текста в найденных файлах.

Параметр для -Include берем Из ячейки excel



$Excel = New-Object -ComObject Excel.Application

$WorkBook = $Excel.Workbooks.Open("C:\Users\admin\Documents\test.xlsx")

$WorkSheet = $WorkBook.Sheets.Item("sheet")

$users = $Worksheet.Range("a1").Value2

Get-Content -Path "C:\Users\admin\search\*" -Include "$users" | Select-String -SimpleMatch "{какой-то текст}"



Проблема в чем, если значение в ячейке ivanov.txt тогда поиск по одному файлу нормально работает, если значение ivanov.txt","petrov.txt", "sidorov.txt то ошибка:

Объект для указанного пути C:\Users\admin\search\* не существует или отфильтрован с помощью параметра -Include или -Exclude."



Если делать поиск вручную, все работает:

Get-Content -Path "C:\Users\admin\search\*" -Include " ivanov.txt","petrov.txt", "sidorov.txt " | Select-String -SimpleMatch "{какой-то текст}"



Прошу помочь c решением.

Также можно написать функцию с перебором ячеек, т.к. пользователи идут по порядку, после чего объединяются в одну строку для поиска через функцию объединения ячеек. Только надо учитывать, что исходное значение бывает разное, то 10 то 50 пользователей и если делать перебор в скрипте PS, то в параметр будут передаваться пустые значения и опять выдавать ошибку.
Аватара пользователя
Serguei Kouzmine

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение Serguei Kouzmine »

Код:

Код: Выделить всё

$a = @("ivanov.txt","petrov.txt", "sidorov.txt")
get-childitem "C:\Users\admin\search\*" -include $a | select-object -expandproperty name
ivanov.txt
petrov.txt
sidorov.txt
Аватара пользователя
YuS_2

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение YuS_2 »

get-childitem не подходит, т.к конечная цель прочитать текст в искомых фалах

если брать в контексте предложенного

$Excel = New-Object -ComObject Excel.Application

$WorkBook = $Excel.Workbooks.Open("C:\Users\admin\Documents\test.xlsx")

$WorkSheet = $WorkBook.Sheets.Item("sheet")

$users = $Worksheet.Range("a1").Value2

$a = @($user)

Get-Content -Path "C:\Users\admin\search\*" -Include $a | Select-String -SimpleMatch "{какой-то текст}"

та же ошибка если параметров несколько.



Пробовал в ячейке такие значения:

"ivanov.txt","petrov.txt", "sidorov.txt "

и такие значения:

ivanov.txt","petrov.txt", "sidorov.txt

Работает только с одним параметром, без кавычек, например ivanov.txt
Аватара пользователя
olmife

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение olmife »

get-childitem не подходит, т.к конечная цель прочитать текст в искомых фалах

если брать в контексте предложенного

$Excel = New-Object -ComObject Excel.Application

$WorkBook = $Excel.Workbooks.Open("C:\Users\admin\Documents\test.xlsx")

$WorkSheet = $WorkBook.Sheets.Item("sheet")

$users = $Worksheet.Range("a1").Value2

$a = @($user)

Get-Content -Path "C:\Users\admin\search\*" -Include $a | Select-String -SimpleMatch "{какой-то текст}"

та же ошибка если параметров несколько.



Пробовал в ячейке такие значения:

"ivanov.txt","petrov.txt", "sidorov.txt "

и такие значения:

ivanov.txt","petrov.txt", "sidorov.txt

Работает только с одним параметром, без кавычек, например ivanov.txt
Аватара пользователя
Serguei Kouzmine

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение Serguei Kouzmine »

что значит get-childitem не подходит

пути файлов узнаете оттуда и читайте на здоровье



так как вы упорно пытаетесь - не выйдет
Аватара пользователя
Serguei Kouzmine

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение Serguei Kouzmine »

Select-String -Path тоже можно пробовать. Get-childitem отдаёт объекты FileInfo, откуда тоже можно текст достать. $_.OpenText().ReadToEnd() в foreach-object должен содержимое дать.
Аватара пользователя
Sham

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение Sham »

технические детали элементарные конечно

напр



Код:

Код: Выделить всё

$x= get-childitem "./*" -include $a | select-object -expandproperty fullname
$x | foreach-object { $path = $_; Get-Content -Path $path }
Аватара пользователя
olmife

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение olmife »

спасибо, пробовал по разному. локально получилось передать из екселя используя @

$WorkBook = $Excel.Workbooks.Open("C:\Users\fedorov_oa\Documents\Заявки\УЗ\test\2.xlsx")

$WorkSheet = $WorkBook.Sheets.Item("users")

$a = @($users)

Get-Content -Path "C:\Users\fedorov_oa\Documents\Заявки\УЗ\test\*" -Include $a | Select-String -SimpleMatch "2023"



но на боевом варианте, поиск происходит на большом hnas с логами, стало сыпать ошибками доступа (хотя раннее простой прямой командой поиска не было), игнор ошибок не помог и все виснет. видимо с помощью @users берется каждая ячейка в т.ч пустые.



вся проблема скрипта не в команде поиска и извлечении, это как раз работает, а в том, что значение вида "ivanov.txt","petrov.txt", "sidorov.txt" из ячейки не передается в параметр поиска. Если в ячейке только ivanov.txt, например, передает корректно.

корректно отрабатывает и вручную копировать текст из екселя и вставлять в поиск Get-Content -Path "C:\Users\admin\search\*" -Include "ivanov.txt","petrov.txt", "sidorov.txt" | Select-String -SimpleMatch "{какой-то текст}"



$x= get-childitem "./*" -include $a | select-object -expandproperty fullname

если делать через такую команду, проблема остается, нет возможности корректно передать из экселя параметры для -Include
Аватара пользователя
Sham

Re: PowerShell - Поиск через PS по значениям из EXCEL

Сообщение Sham »

Непонятен тип данных. Если это обычная строка с запятыми, то в массив её сделать можно с помощью -split

Код:

Код: Выделить всё

'"ivanov.txt","petrov.txt", "sidorov.txt"' -replace '"' -split '\s*,\s*'

. Узнайте тип с get-member или .GetType() например.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»