如何使用批处理(Batch)修复邮件密码过滤提取程序?
解决批处理提取邮箱密码时的冗余内容问题
我有一个名为file.txt的文本文件,内容如下:
Combo: testing123mail@gmail.com:password As Combo: abcdefghijklmnopqrstuvwxyz@gmail.com:ajfbdf some text here some more text here As Combo: hadvsfhia@ahfjbadj.com:password@1 some random text here iloveu@gmail.com:passypassyword123 goldenmammy@hotmail.com:youtube123我运行以下代码,试图从file.txt中仅过滤提取「邮件:密码」格式的内容:
for /f "tokens=3" %%a in ('type file.txt^|find "As Combo:"') do >>mail.txt echo %%a for /f "tokens=2" %%b in ('type file.txt^|find "Combo:"') do >>mail.txt echo %%b for /f "tokens=1" %%c in ('type file.txt^|":"') do >>mail.txt echo %%c预期mail.txt的输出内容为:
abcdefghijklmnopqrstuvwxyz@gmail.com:ajfbdf hadvsfhia@ahfjbadj.com:password@1 testing123mail@gmail.com:password iloveu@gmail.com:passypassyword123 goldenmammy@hotmail.com:youtube123但实际输出包含冗余内容:
abcdefghijklmnopqrstuvwxyz@gmail.com:ajfbdf hadvsfhia@ahfjbadj.com:password@1 testing123mail@gmail.com:password Combo: Combo: Combo: As As iloveu@gmail.com:passypassyword123 goldenmammy@hotmail.com:youtube123
问题根源
你的代码主要有两个问题:
- 第三个
for循环存在语法错误:你写成了type file.txt^|":",缺少了find命令,正确写法应为type file.txt ^| find ":"。即使修正语法,tokens=1会按空格拆分每行并提取第一个部分,导致错误抓取到As、Combo:这类无关内容。 - 第三个循环没有过滤已被前两个循环处理过的带前缀行,导致重复处理并输出冗余内容。
解决方案
下面是修正后的批处理脚本,能精准提取所有符合邮箱:密码格式的内容,不会产生冗余:
@echo off setlocal enabledelayedexpansion :: 清空目标文件(避免多次运行累积旧内容) echo. > mail.txt >>mail.txt ( :: 处理带 "As Combo:" 前缀的行,提取前缀后的邮箱密码 for /f "tokens=3" %%a in ('type file.txt ^| find "As Combo:"') do ( echo %%a ) :: 处理带 "Combo:" 前缀的行,提取前缀后的邮箱密码 for /f "tokens=2" %%b in ('type file.txt ^| find "Combo:"') do ( echo %%b ) :: 处理无前缀的纯邮箱:密码行,先过滤掉已处理的带前缀行 for /f "delims=" %%c in ('type file.txt ^| findstr /v /c:"Combo:" /c:"As Combo:" ^| find ":"') do ( echo %%c ) ) endlocal
脚本说明
- 前两个
for循环保留了你原本的正确逻辑,分别提取带As Combo:和Combo:前缀行中的邮箱密码部分。 - 第三个循环用
findstr /v过滤掉已处理的带前缀行,再用find ":"筛选出包含冒号的纯邮箱密码行,delims=确保整行被输出,不会被空格拆分。 - 用
>>mail.txt (把所有输出合并写入,比多次追加更高效。
运行这个脚本后,mail.txt的内容就会和你预期的完全一致。
内容的提问来源于stack exchange,提问作者sai Surya
相关产品推荐
相关产品推荐

