如何删除子文件夹而不删除父文件夹和子文件夹?

时间:2016-08-31 08:59:22

标签: batch-file cmd

对于这种类型的目录结构:

\\rdwlhsdevserver\root\user1\folders\testdat.txt
\\rdwlhsdevserver\root\abhay\testdat.txt
\\rdwlhsdevserver\root\testuser\folders1\folder2\testdat.txt
\\rdwlhsdevserver\root\devadmin\input\testdat.txt
\\rdwlhsdevserver\root\admin\testdata\testdat.txt

我知道我可以使用del /s /q \\rdwlhsdevserver\root\*从父文件夹和所有子文件夹中删除文件。但我想删除除\\rdwlhsdevserver\root\<folder>\以外的所有文件夹和文件。

运行cmd输出后应该像:

\\rdwlhsdevserver\root\user1\
\\rdwlhsdevserver\root\abhay\
\\rdwlhsdevserver\root\testuser\
\\rdwlhsdevserver\root\devadmin\
\\rdwlhsdevserver\root\admin\

2 个答案:

答案 0 :(得分:2)

pushd "\\rdwlhsdevserver\root" && (
    for /d %%a in (*) do ( cd "%%a" && ( 2>nul rmdir . /s /q & cd .. ) )
    del /f /q *
    popd
) 

这会将当前活动目录(pushd)更改为目标目录,如果每个文件夹(&&)没有问题(条件执行运算符for /d),则更改为(cd),删除其内容(rmdir)并返回父文件夹。完成后,删除(del)根文件夹中的文件并恢复初始活动目录。

为什么不将内部for更改为for /d %%a in (*) do rmdir "%%a" /s /q?因为这样也会删除文件夹。但是,如果我们首先使文件夹成为当前活动目录(cd),我们将能够删除其内容,但不能删除正在使用的文件夹本身(2>nulstderr的重定向1}}流到nul以隐藏rmdir中的错误,说它无法删除该文件夹,因为它正在使用中)

答案 1 :(得分:1)

您需要使用\\rdwlhsdevserver\root\循环遍历for /D的所有子目录,然后再通过另一个for /D循环遍历每个子目录的子目录,然后应用对每个返回的项目rmdir(或rd)命令,如下所示:

for /D %%J in ("\\rdwlhsdevserver\root\*") do (
    for /D %%I in ("%%~J\*") do (
        rmdir /S /Q "%%~I"
    )
)

或直接在命令提示符下:

for /D %J in ("\\rdwlhsdevserver\root\*") do @for /D %I in ("%~J\*") do @rmdir /S /Q "%~I"

为了整体性能,如果要删除目录文件,我建议在删除文件之前执行上述目录删除({{1} })。请注意,您的del /S /Q "\\rdwlhsdevserver\root\*"命令行还会删除目录del中的文件。