Скрипт Powershell для возврата результатов поиска из списка ключевых слов - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть название проекта под названием «SFO104», и у меня есть список серийных номеров, например, 5011849, 5011850 и т. Д., И мне нужно найти длинный список из 500+ серийных номеров, чтобы узнать, существуют ли они в каких-либо других документах, не относящихся к название проекта SFO104 или номер заказа 114786 .

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

$searchWords = gc C:\Users\david.craven\Documents\list.txt 
$results = @()
Foreach ($sw in $searchWords)
{
    $files = gci -path C:\Users\david.craven\Dropbox\ -filter "*$sw*" -recurse | select FullName

    foreach ($file in $files)
    {
        $object = New-Object System.Object
        $object | Add-Member -Type NoteProperty –Name SearchWord –Value $sw
        $object | Add-Member -Type NoteProperty –Name FoundFile –Value $file
        $results += $object
    }

}

$results | Export-Csv C:\Users\david.craven\Documents\results.csv -NoTypeInformation

На рисунке ниже показан мой поиск по серийному номеру 5011849 , и возвращенные результаты соответствуют проекту SFO104 , как и ожидалось.

enter image description here

1 Ответ

0 голосов
/ 02 ноября 2018

Ваш код работает, файл заполняется. Однако то, что вы указали, не имеет заголовков, определенных как на снимке экрана. Кроме того, как выглядит этот list.txt. Мой searchlist.txt - это файл с одним столбцом:

Hello
client

Использование вашего кода как есть, только изменение пути к файлу и имени и небольшое изменение места доступа к имени файла дает эти результаты ...

$searchWords = gc 'D:\Scripts\searchlist.txt' 
$results = @()
Foreach ($sw in $searchWords)
{
    $files = gci -path d:\temp -filter "*$sw*" -recurse

    foreach ($file in $files)
    {
        $object = New-Object System.Object
        $object | Add-Member -Type NoteProperty –Name SearchWord –Value $sw
        $object | Add-Member -Type NoteProperty –Name FoundFile –Value $file.FullName
        $results += $object
    }

}

$results | Export-Csv d:\temp\searchresults.csv -NoTypeInformation


# Results
# psEdit -filenames 'd:\temp\searchresults.csv'

SearchWord FoundFile
---------- ---------
Hello      D:\temp\Duplicates\PowerShellOutput.txt
Hello      D:\temp\Duplicates\BeforeRename1\PowerShellOutput.txt
Hello      D:\temp\Duplicates\PoSH\PowerShellOutput.txt
Hello      D:\temp\Duplicates\Text\PowerShellOutput.txt
client     D:\temp\Client.txt
client     D:\temp\Duplicates\CertLabClients_v1.ps1
client     D:\temp\Duplicates\Check Logon Server for Client.ps1
client     D:\temp\Duplicates\Create Wireless Hosted Networks in Windows Clients.ps1
...

Обновление для OP

Так как вы используете отдельный список запятых. Вы должны разбить это на отдельные предметы. Я изменил свой файл на этот

Hello,client

Вы не можете сопоставить этот макет, если не пытаетесь сопоставить всю последовательную строку. Итак, если я нарушу вышеизложенное таким образом ...

$searchWords = (gc 'D:\Scripts\searchlist.txt') -split ','

… таким образом, результаты будут такими, как показано ранее.

Обновление для OP

Пример, тест с этим (другой грубый подход) ...

Foreach ($sw in $searchWords)
{
    Get-Childitem -Path "d:\temp" -Recurse -include "*.txt","*.csv" | 
    Select-String -Pattern "$sw" | 
    Select Path,LineNumber,@{n='SearchWord';e={$sw}}
}

Линейный номер был добавлен в сон, поэтому покажите, где находится строка. Также обратите внимание, что ваш код и то, что я предоставляю здесь, будет работать только для текстовых, CSV-файлов.

Если вы планируете нажимать на них, doc, docx, xls, xlsx, это означает, что вам потребуется больше кода, поскольку вам нужно использовать стандартные приложения Word, Excel, чтобы открывать и читать эти файлы.

Это означает использование модели объектов COM для каждого из этих типов файлов в вашем коде. Как обсуждено и показано здесь:

Как заставить PowerShell искать в документе Word подстановочные знаки и возвращать найденное слово?

Вам нужно сделать аналогичную вещь для Excel или PowerPoint, и если у вас есть PDF, для этого требуется и дополнение.

Обновление для OP

Как я уже сказал, я собрал это все вместе быстро, так что это немного грубо (без обработки ошибок и т. Д.), Когда я проверил его, используя мой входной файл и целевое дерево папок, и оно работает.

# This is what my input looks like
Hello,client
595959, 464646 
LIC

Выполнение кода должно было дать вам следующие результаты, используя только файлы .txt, .csv. Использование любого другого типа файла приведет к ошибке в соответствии с моим комментарием, приведенным выше, относительно этого подхода нельзя использовать для нетекстовых файлов без использования собственного приложения для нетекстового типа файла.

$searchWords = ((gc 'D:\Scripts\searchlist.txt') -split ',').Trim()

Foreach ($sw in $searchWords)
{
    Get-Childitem -Path "d:\temp" -Recurse -include "*.txt","*.csv" | 
    Select-String -Pattern "$sw" | 
    Select Path,LineNumber,@{n='SearchWord';e={$sw}}
}

Path                                            LineNumber SearchWord
----                                            ---------- ----------
D:\temp\Duplicates\BeforeRename1\PsGet.txt             157 Hello     
...    
D:\temp\Duplicates\PoSH\PsGet.txt                      157 Hello     
...   
D:\temp\Duplicates\BeforeRename1\PoSH-Get-Mo...        108 client    
D:\temp\Duplicates\BeforeRename1\Powershell ...         12 client    
D:\temp\Duplicates\BeforeRename1\Powershell ...         15 client    
D:\temp\Duplicates\BeforeRename1\PsGet.txt             454 client    
...
D:\temp\newfile.txt                                      4 client    
D:\temp\MyFile.txt                                       5 595959    
D:\temp\ProcessNames.csv                                 4 595959    
D:\temp\Duplicates\Text\JSON-CSS.txt                    30 464646    
D:\temp\Duplicates\JSON-CSS.txt                         30 464646    
D:\temp\MyFile.txt                                       5 464646    
D:\temp\ProcessNames.csv                                 4 464646    
D:\temp\Duplicates\BeforeRename1\GetSetScree...          7 LIC 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...