修复PowerShell脚本:提取多网页URL并去重保存至TXT文件
修复PowerShell域名提取脚本问题
需求说明
从指定的两个威胁Feed链接中提取域名,去除http://、https://、127.0.0.1这类前缀,去重后保存到单个TXT文件。
原脚本的问题
原脚本存在以下关键问题导致无法得到预期结果:
- 循环变量为
$url,但下载数据时错误使用了未定义的$threatFeedUrl变量,导致每次循环都无法正确下载Feed内容。 - 正则表达式仅匹配
127.0.0.1开头的域名,未处理http/https开头的域名,覆盖范围不符合需求。 - 每次循环都用
Out-File直接覆盖输出文件,最终只会保留最后一个Feed的结果,没有累加所有来源的内容。 - 缺少去重逻辑,无法保证结果中没有重复域名。
- 初始化了
$allUrls数组但未实际使用,属于冗余代码。
修复后的脚本
$threatFeedUrls = @( "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareHosts.txt", "https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt" ) # 初始化数组存储所有提取的域名 $allDomains = @() foreach ($url in $threatFeedUrls) { try { # 下载Feed数据,用Invoke-WebRequest更适合文本内容,避免自动解析问题 $threatFeedData = Invoke-WebRequest -Uri $url -UseBasicParsing | Select-Object -ExpandProperty Content # 正则匹配:覆盖127.0.0.1前缀、http/https开头域名、纯域名格式 $pattern = '(?:127\.0\.0\.1\s+|https?://)([a-zA-Z0-9.-]+)|^([a-zA-Z0-9.-]+)$' $matches = [regex]::Matches($threatFeedData, $pattern, [System.Text.RegularExpressions.RegexOptions]::Multiline) # 提取匹配到的域名,过滤空值和注释行 $extractedDomains = foreach ($match in $matches) { $domain = $match.Groups[1].Value if ([string]::IsNullOrEmpty($domain)) { $domain = $match.Groups[2].Value } if (-not [string]::IsNullOrEmpty($domain) -and $domain -notmatch '^#') { $domain } } # 将当前Feed提取的域名添加到总数组 $allDomains += $extractedDomains Write-Host "成功处理Feed: $url" } catch { Write-Host "处理Feed失败: $url,错误信息: $_" } } # 去重并保存到文件 $outputFilePath = 'output250.txt' $allDomains | Select-Object -Unique | Out-File -FilePath $outputFilePath -Encoding utf8 Write-Host "所有域名已提取、去重并保存到: $outputFilePath"
修复点说明
- 修正变量名错误:循环中使用正确的
$url变量下载Feed内容,避免无效请求。 - 扩展正则匹配规则:覆盖
127.0.0.1前缀、http/https开头的域名,以及纯域名格式的内容,确保所有来源的域名都能被提取。 - 累加所有域名:将每个Feed提取的域名添加到总数组,避免覆盖之前的结果。
- 添加去重逻辑:使用
Select-Object -Unique对所有域名去重。 - 增加错误处理:用
try/catch捕获下载失败的情况,输出错误信息便于排查。 - 优化文本获取:改用
Invoke-WebRequest获取文本内容,避免Invoke-RestMethod对某些文本格式的自动解析问题。 - 过滤无效内容:排除注释行和空值,确保结果纯净。
内容的提问来源于stack exchange,提问作者Daren
相关产品推荐
相关产品推荐

