Рекурсивно соскоб в Powershell - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь очистить адреса электронной почты с помощью Powershell из каталога, подкаталогов и внутри них .txt файлов.Итак, у меня есть этот код:

$input_path = ‘C:\Users\Me\Documents\toscrape’
$output_file = ‘C:\Users\Me\Documents\toscrape\output.txt’
$regex = ‘\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b’
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file

Но когда я его выполняю, он выдает ошибку

select-string : The file C:\Users\Me\Documents\toscrape\ can not be read: Could not
path 'C:\Users\Me\Documents\toscrape\'.
At line:1 char:1
+ select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Select-String], ArgumentException
    + FullyQualifiedErrorId : ProcessingFile,Microsoft.PowerShell.Commands.SelectStringCommand

Я пробовал варианты $ input_path с Get-Item,Get-ChildItem, -Recurse, но ничего не работает.Может кто-нибудь выяснить, как мне нужно очистить свое местоположение и все его подкаталоги и файлы для шаблона регулярных выражений?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Ваше исправление не сработало, но дало мне еще одну ошибку, @Bacon Bits.Однако вы поставили меня на правильный путь.Я немного адаптировался, и мне показалось, что это сработало.

$input_path = 'C:\Users\Me\Documents\toscrape'
$output_file = 'C:\Users\Me\Documents\toscrape\output.txt'
$regex = '\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b'

Get-ChildItem $input_path -Recurse | Select-String -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file

0 голосов
/ 23 октября 2018

Ошибка в том, что Select-String предполагает, что -Path указывает на файл или является шаблоном подстановки, а $input_path указывает на папку.Вы можете использовать:

$input_path = 'C:\Users\Me\Documents\toscrape\*.txt'
Select-String $input_path ....

Однако, поскольку вы хотите выполнять рекурсию через подкаталоги, вам нужно будет использовать Get-ChildItem для этого.

$input_path = 'C:\Users\Me\Documents\toscrape'
$output_file = 'C:\Users\Me\Documents\toscrape\output.txt'
$regex = '\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b'

Get-ChildItem $input_path -Include *.txt -Recurse |
    Select-String -Pattern $regex -AllMatches |
    Select-Object -ExpandProperty Matches |
    Select-Object -ExpandProperty Value |
    Set-Content $output_file

Обратите внимание, чтоВаше регулярное выражение может вызвать проблемы здесь.Вы используете \b для границы слова, но точка ., дефис - и знак процента % - все это не слова (\W).Символы слова (\w): [A-Za-z0-9_].

Например:

PS C:\> '%username@example.com' -match '\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b'
True
PS C:\> $Matches.Values
username@example.com

Если это то, что вы хотите, чтобы паттерн делал, это здорово, но это то, что нужнов курсе. Regex для адреса электронной почты является общеизвестно трудным .

...