使用批处理从列表中删除重复的顶级文件夹名称
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
啊-你想确保列表中的任何添加都不包含以前的条目...
我需要从文件夹列表中删除重复的文件夹名称。当有超过 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
啊-你想确保列表中的任何添加都不包含以前的条目...