使用批处理从列表中删除重复的顶级文件夹名称

Delete duplicate top-level folder names from list with batch

我需要从文件夹列表中删除重复的文件夹名称。当有超过 1 个子文件夹时,会出现重复。我最终得到如下列表。我想删除任何有 sub2 文件夹的行。

folder1\sub1
folder2\sub1
folder2\sub1\sub2
folder3\sub1

如果只有一个 sub2 文件夹名,下面的代码可以工作,但如果有多个 sub2,那就很尴尬了——没有希望了。一定有更好的方法。非常感谢任何帮助。

@Echo off
SETLOCAL EnableDelayedExpansion

    :: Write the sub2 foldernames to a tmp file
    For /f "tokens=3 delims=\" %%I IN (folderlist.txt) DO Echo %%I >>temp.tmp

    :: Set var for each sub2 name in tmp file and 
    :: call routine to write lines that don't contain that name
    For /f %%G in (temp.tmp) do (
        Set findstring=%%G
        CALL :FindDup
    )
EXIT

:findDup            
    For /f %%H in ('Type folderlist.txt ^|Find "!findstring!" /v') Do (
        Echo %%H >> NoDup.txt
    )
exit /b

FWIW:我正在使用此命令生成列表,然后删除 folder1、folder2 等之前的路径

    For /d %%G in (*) do dir /ad /on /s /b "%%G" >> folderlist.txt
@ECHO OFF
SETLOCAL
FOR /f "delims=" %%a IN (q20840158.txt) DO (
 FOR /f "tokens=1,3delims=\" %%b IN ("%%a") DO IF "%%c"=="" ECHO(%%a
)

GOTO :EOF

我使用了一个名为 q20840158.txt 的文件,其中包含您的数据用于我的测试。

但是 - "duplicate" 真的不清楚你的意思。 在此上下文中如何精确定义重复项?

你就快完成了,如果你只想要删除子文件夹后的结果列表,只需尝试将适当的行回显到列表文件中,先将它复制到一个临时文件中。

move folderlist.txt %temp%\folders.txt
for /f "tokens=1,2,* delims=\" %%a in (%temp%\folders.txt) do (
   if .%%c==. echo %%a\%%b >>folderlist.txt
)

如果要从磁盘中删除文件夹,请将行更改为

if not .%%c==. rd /s %%a\%%b\%%c
@ECHO OFF
SETLOCAL
COPY NUL newfile.txt >NUL 2>nul
FOR /f "delims=" %%a IN (q20840158.txt) DO (
 ECHO %%a|FINDSTR /I /L /g:"newfile.txt" >NUL 2>NUL
 IF ERRORLEVEL 1 >>"newfile.txt" ECHO(%%a
)

TYPE newfile.txt
GOTO :EOF

我使用了一个名为 q20840158.txt 的文件,其中包含您的数据用于我的测试。

产生newfile.txt

啊-你想确保列表中的任何添加都不包含以前的条目...