Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Поиск через PS по значениям из EXCEL

Ответить
Настройки темы
PowerShell - Поиск через PS по значениям из EXCEL

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет. Не специалист в 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, то в параметр будут передаваться пустые значения и опять выдавать ошибку.

Отправлено: 15:21, 20-06-2023

 

Старожил


Сообщения: 250
Благодарности: 51

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$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

Отправлено: 15:35, 20-06-2023 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:20, 20-06-2023 | #3


Старожил


Сообщения: 250
Благодарности: 51

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 16:41, 20-06-2023 | #4


Deadooshka


Сообщения: 2558
Благодарности: 697

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:30, 20-06-2023 | #5


Старожил


Сообщения: 250
Благодарности: 51

Профиль | Отправить PM | Цитировать


технические детали элементарные конечно
напр
Код: Выделить весь код
$x= get-childitem "./*" -include $a | select-object -expandproperty fullname
$x | foreach-object { $path = $_; Get-Content -Path $path }

Отправлено: 21:27, 20-06-2023 | #6


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


спасибо, пробовал по разному. локально получилось передать из екселя используя @
$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

Отправлено: 09:52, 21-06-2023 | #7


Deadooshka


Сообщения: 2558
Благодарности: 697

Профиль | Отправить PM | Цитировать


Непонятен тип данных. Если это обычная строка с запятыми, то в массив её сделать можно с помощью -split
Код: Выделить весь код
'"ivanov.txt","petrov.txt", "sidorov.txt"' -replace '"' -split '\s*,\s*'
. Узнайте тип с get-member или .GetType() например.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:30, 21-06-2023 | #8


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Благодарствую. Помог 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 "{какой-то текст}"

Отправлено: 11:53, 21-06-2023 | #9


Deadooshka


Сообщения: 2558
Благодарности: 697

Профиль | Отправить PM | Цитировать


Цитата olmife:
-Include "$users" »
а какой смысл массив кавычить?
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:20, 21-06-2023 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Поиск через PS по значениям из EXCEL

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - скрипт отключения пользователей из Exel в AD через PS yuriy.nepomnyashchiy.3@fb Скриптовые языки администрирования Windows 31 12-07-2017 17:25
CMD/BAT - [решено] Поиск по значениям реестра dosperados Скриптовые языки администрирования Windows 7 19-03-2015 05:49
PowerShell - [решено] Поиск по значениям реестра dosperados Скриптовые языки администрирования Windows 21 18-03-2015 12:52
2007 - Макрос Excel поиск по листам в книге с условием muradasilov Microsoft Office (Word, Excel, Outlook и т.д.) 2 26-02-2013 17:32




 
Переход