Ошибка в том, что 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 для адреса электронной почты является общеизвестно трудным .