#powershell
Вопрос:
Я пытаюсь выполнить поиск в каталоге файлов и извлечь все пути к файлам, в которых есть шаблон. Затем просмотрите каждый файл и найдите другой шаблон текста. Это работает, если я сделаю это вручную:
Select-String -Path "C:inetpubmailrootBadmail-Archive03c908531613052021000000A2.BAD" -Pattern ('Final-Recipient') | Select -ExpandProperty line
Это не так, если я делаю это в цикле:
$FileList = Get-ChildItem "C:inetpubmailrootBadmail-Archive" -Filter *.BAD | Select-String -Pattern 'Diagnostic-Code: smtp;550 5.1.1' | Select-Object Path
$FileList = Get-ChildItem "C:inetpubmailrootBadmail-Archive" -Filter *.BAD | Select-String -Pattern 'Diagnostic-Code: smtp;550 5.1.2' | Select-Object Path
$FileList = Get-ChildItem "C:inetpubmailrootBadmail-Archive" -Filter *.BAD | Select-String -Pattern 'Diagnostic-Code: smtp;550 5.2.1' | Select-Object Path
foreach($filepath in $FileList) {
$BADSearch = Select-String -Path $filepath -Pattern ('Final-Recipient') | Select -ExpandProperty line
$eMailAddress = $BADSearch.Split(";")[1]
echo "File Path: $filepath"
echo $eMailAddress
}
File Path: C:inetpubmailrootBadmail-Archive03c908531613052021000000A2.BAD
Select-String : Cannot find drive. A drive with the name '@{Path=C' does not exist.
At C:ScriptsBadEmails-SQLGenerator.ps1:46 char:14
... BADSearch = Select-String -Path $filepath -Pattern ('Final-Recipient' ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : ObjectNotFound: (@{Path=C:String) [Select-String], DriveNotFoundException
FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.SelectStringCommand
Комментарии:
1. Вы рассматриваете ответ на
Get-ChildItem
вызов как строку. Это не. Вам нужно пройти правильный путь в виде строки, чтобыSelect-String
понравитьсяSelect-String -Path $filepath.FullName # ...
2. @MaximilianBurszley Я только что встал на этот путь и пытался использовать $filepath.toString. Это говорит о том, что Путь пуст. В GCI я должен просто сделать что-то вроде таблицы форматов, а затем выполнить путь к файлу$. Полное имя внизу?
3. О, я не прокрутил вправо, чтобы увидеть, что вы уже используете
Select-Object
и выполняете другие фильтры… Это еще одна часть вашей проблемы4. @MaximilianBurszley Я думаю, что понял твой ответ!
5. Я удалил
Select-Object
его из GCI, а затем просто использовал$filepath.Path
Ответ №1:
Ваша проблема заключается в том, чтобы рассматривать любой произвольный объект как строку. Select-String
ожидает string
экземпляр для Path
параметра, но вы передаете ему результирующий MatchInfo
объект, возвращенный из предыдущего Select-String
вызова.
Вам нужно будет указать путь, выбрав .Path
элемент из вывода предыдущей команды:
Select-String -Path $filepath.Path # ...