Войти

Показать полную графическую версию : Поиск через PS по значениям из EXCEL


olmife
20-06-2023, 15:21
Всем привет. Не специалист в 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
20-06-2023, 15:35
$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

olmife
20-06-2023, 16:20
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
20-06-2023, 16:41
что значит get-childitem не подходит
пути файлов узнаете оттуда и читайте на здоровье

так как вы упорно пытаетесь - не выйдет

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

Serguei Kouzmine
20-06-2023, 21:27
технические детали элементарные конечно
напр
$x= get-childitem "./*" -include $a | select-object -expandproperty fullname
$x | foreach-object { $path = $_; Get-Content -Path $path }

olmife
21-06-2023, 09:52
спасибо, пробовал по разному. локально получилось передать из екселя используя @
$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
21-06-2023, 10:30
Непонятен тип данных. Если это обычная строка с запятыми, то в массив её сделать можно с помощью -split '"ivanov.txt","petrov.txt", "sidorov.txt"' -replace '"' -split '\s*,\s*'. Узнайте тип с get-member или .GetType() например.

olmife
21-06-2023, 11:53
Благодарствую. Помог split. Я изначально убрал ковычки в ячейке (они функцией как раз добавлялись).
Тип String[] System.Array

Значения в ячейке: ivanov.txt,petrov.txt,sidorov.txt
Итоговый код:
$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 -split '\s*,\s*')
Get-Content -Path "C:\Users\admin\search\*" -Include "$users" | Select-String -SimpleMatch "{какой-то текст}"

Sham
21-06-2023, 12:20
-Include "$users" »
а какой смысл массив кавычить?

YuS_2
21-06-2023, 12:54
New-Object -ComObject Excel.Application »
Есть хороший модуль: https://github.com/dfinke/ImportExcel
Позволяет работать с файлами, даже без установки самого Excel... попробуйте - возможно, понравится.

olmife
21-06-2023, 13:40
да, верно без кавычек.

DJ Mogarych
21-06-2023, 21:29
ImportExcel :super:
Импортировать файл и потом делать с ним что угодно - искать, переформатировать, фильтровать и т. д. Это в сто раз лучше, чем возюкаться с COM-объектами.
Пользуюсь уже несколько лет, на работе все отчёты начальству шлются с помощью этого модуля. Шикарная вещь.

Pavel Nagaev
29-06-2023, 13:29
Всем привет. Не специалист в PS, но очень требуется автоматизация и запилил, что смог.
Задача:
Необходимо из EXCEL значения ячейки брать параметры для поиска файлов на диске (значения там периодически разные типа : "ivanov.txt","petrov.txt", "sidorov.txt" и т.д список может быть очень большой), после чего производится поиск определенного текста в найденных файлах.
Параметр для -Include берем Из ячейки excel »

Вы бы файл показали, было бы быстрее и полезнее.




© OSzone.net 2001-2012