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

Deleting duplicate text lines using a batch file

我正在创建一个文本文件,显示文件夹中每个文件的文件扩展名。我想删除重复项,因为它会为每个文件创建一行文本。

经过一番搜索,我发现我应该使用 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
)

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

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

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

这里我使用find而不是findstr,因为只搜索简单的文字字符串。 find(如 findstr)如果至少遇到一个匹配项,则将 ErrorLevel 设置为 0,如果找到 none,则设置为 1 .

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

第一行为find创建一个空文件filtered.txt,以免第一次执行失败。


如果您想使用文件 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
    )
)

这段代码和上面的差不多;唯一的区别是之前创建了 initial.txt(可能包含重复项),以及其内容的枚举(通过 for /F)而不是直接枚举当前目录。