如何使用 Powershell 从文件中递归地抓取电子邮件地址?

Posted

技术标签:

【中文标题】如何使用 Powershell 从文件中递归地抓取电子邮件地址?【英文标题】:How to recursively scrape email addresses from files with Powershell? 【发布时间】:2019-03-27 21:25:03 【问题描述】:

我尝试使用 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,但似乎没有任何效果。谁能弄清楚我需要如何为正则表达式模式抓取我的位置及其所有子目录和文件?

【问题讨论】:

我并不完全清楚您要做什么,但是如果您需要从目录结构中获取 TXT 文件列表,您需要这样的东西:Get-ChildItem -Path $input_path -Include "*.txt" -Recurse跨度> 我认为这不是正确的正则表达式 【参考方案1】:

您的更正无效,但又给了我一个错误,@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

【讨论】:

【参考方案2】:

错误是因为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 for an email address 是 notoriously difficult。

【讨论】:

以上是关于如何使用 Powershell 从文件中递归地抓取电子邮件地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何递归获取PowerShell中的所有文件和文件夹的大小,自定义输出

如何使用PowerShell递归搜索目录中的所有文件,包括隐藏目录中的隐藏文件?

如何使用 PowerShell 递归删除具有特定名称的文件夹?

如何递归删除PowerShell中的所有空文件夹?

如何递归归档powershell文件夹中的每个文件?

PowerShell - 递归提取特定文件夹的内容