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

时间:2015-01-20 07:54:00

标签: batch-file

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

folder1中\ SUB1
文件夹2 \ SUB1
文件夹2 \ SUB1 \ SUB2
folder3 \ sub1

以下代码可以工作,如果只有一个sub2 foldername,但它很尴尬 - 如果不止一个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

3 个答案:

答案 0 :(得分:0)

@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的文件,其中包含我的测试数据。

但是 - 它真的不清楚你的意思是什么?重复"。 在此上下文中定义重复的准确程度如何?

答案 1 :(得分:0)

你几乎就在那里,如果你只想在删除子文件夹后得到结果列表,只需尝试将适当的行回显到列表文件,先将它复制到临时文件中。

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

答案 2 :(得分:0)

@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

啊 - 你想确保列表中的任何新增内容都不包含以前的条目......