使用批处理文件删除重复的文本行

iau*_*eee 3 for-loop batch-file filter duplicates findstr

我正在创建一个文本文件,显示文件夹中每个文件的文件扩展名.我想摆脱重复,因为它为每个文件创建一行文本.

经过一些搜索后,我发现我应该使用findstr覆盖初始文件,删除特定扩展名的新版本(在我将其写入过滤后的文件之后).

for %%A in (*.*) do echo %%~xA >> initial.txt
for /F %%B in (initial.txt) do (
    echo %%B >> filtered.txt
    for /F %%C in (initial.txt) do findstr /v %%C initial.txt > initial.txt
)
Run Code Online (Sandbox Code Playgroud)

但它仍然将初始文件留空(如预期的那样),同时仍然将每一行复制到filtered.txt文件.我很乐意得到一些帮助.

asc*_*pfl 6

您可以filtered.txt立即创建文件,不需要initial.txt:

> "filtered.txt" rem/
for %%A in ("*.*") do (
    > nul find /I "%%~xA" "filtered.txt"
    if ErrorLevel 1 (
        >> "filtered.txt" echo %%~xA
    )
)
Run Code Online (Sandbox Code Playgroud)

我在这里使用find而不是findstr因为只搜索简单的文字字符串.find(喜欢findstr)设置ErrorLevel0如果至少一个匹配遇到,并且1如果没有被发现.

根据返回的内容ErrorLevel,当前迭代的文件扩展名将%%~xA被回显并重定向到filtered.txt或不重定向.因此,如果filtered.txt已经包含当前项目,则不会回显,但如果未遇到匹配项,则该项目将附加到文件中.

第一行创建一个空文件filtered.txt,find以便在第一次执行时不会失败.


如果您仍想使用该文件initial.txt,您可以执行以下操作:

>> "initial.txt" (
    for %%A in ("*.*") do echo %%~xA
)
> "filtered.txt" rem/
for /F "usebackq eol=| delims=" %%A in ("initial.txt") do (
    > nul find /I "%%~xA" "filtered.txt"
    if ErrorLevel 1 (
        >> "filtered.txt" echo %%~xA
    )
)
Run Code Online (Sandbox Code Playgroud)

这段代码与上面几乎相同; 唯一的区别是先前创建initial.txt(可能包含重复项),以及枚举其内容(by for /F)而不是直接枚举当前目录.