![]() |
Поиск через PS по значениям из EXCEL
Всем привет. Не специалист в 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, то в параметр будут передаваться пустые значения и опять выдавать ошибку. |
Код:
$a = @("ivanov.txt","petrov.txt", "sidorov.txt") |
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 |
что значит get-childitem не подходит
пути файлов узнаете оттуда и читайте на здоровье так как вы упорно пытаетесь - не выйдет |
Select-String -Path тоже можно пробовать. Get-childitem отдаёт объекты FileInfo, откуда тоже можно текст достать. $_.OpenText().ReadToEnd() в foreach-object должен содержимое дать.
|
технические детали элементарные конечно
напр Код:
$x= get-childitem "./*" -include $a | select-object -expandproperty fullname |
спасибо, пробовал по разному. локально получилось передать из екселя используя @
$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 |
Непонятен тип данных. Если это обычная строка с запятыми, то в массив её сделать можно с помощью -split
Код:
'"ivanov.txt","petrov.txt", "sidorov.txt"' -replace '"' -split '\s*,\s*' |
Благодарствую. Помог 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 "{какой-то текст}" |
Цитата:
|
Цитата:
Позволяет работать с файлами, даже без установки самого Excel... попробуйте - возможно, понравится. |
да, верно без кавычек.
|
ImportExcel :super:
Импортировать файл и потом делать с ним что угодно - искать, переформатировать, фильтровать и т. д. Это в сто раз лучше, чем возюкаться с COM-объектами. Пользуюсь уже несколько лет, на работе все отчёты начальству шлются с помощью этого модуля. Шикарная вещь. |
Цитата:
|
Время: 07:12. |
Время: 07:12.
© OSzone.net 2001-