批处理命令从一个文件夹中删除所有文件(子文件夹和文件)

时间:2016-08-26 06:45:10

标签: batch-file cmd

首先,类似的问题在过去得到了回答,但并不完全是我所拥有的问题。在其他一些解决方案中,建议隐藏文件夹/文件和更改属性,我不希望这样,除非没有更简单的方法。此外,我尝试了此处建议的解决方案(以及其他几个):MS-DOS command to delete all files except one

但由于两个原因,我的工作无效:

  1. 这也删除了文件,我不想。
  2. 这不删除子文件夹,只删除文件。
  3. 所以,我有文件夹c:/users/data,在那里,我有5个文件夹和6个文件我要删除除web.config之外的所有内容,为此我运行批处理文件,如下所示:

    @echo off
    for %%j in (C:\Users\data\*) do if not %%j == Web.config del %%j
    pause
    

    但是当我运行批处理文件时,这将删除包括web.config在内的所有文件,并且不会删除任何子文件夹,如果我使用/d开关,则只会删除文件夹不是文件。如何删除文件和文件夹?

3 个答案:

答案 0 :(得分:1)

我不确定web.config文件的存储位置或者是否有多个,所以......

只有一个web.config文件

只需锁定文件(将文件重定向为输入)并删除其他任何内容

@echo off
    setlocal enableextensions disabledelayedexpansion

    pushd "c:\users\data" && >nul 2>nul (
        <"web.config" rmdir . /s /q
        popd
    )

代码将

  1. pushd)更改为目标文件夹(我们需要确保这只会从目标位置删除信息)将其设置为当前活动目录并锁定它(我们无法删除当前活动目录)。如果命令可以更改为文件夹,则

  2. rmdir)将web.config重定向为rmdir命令的输入。这将锁定文件,以便在命令结束之前不能删除它。 rmdir . /s /q删除未锁定在当前活动目录(及其下方)内的任何内容

  3. popd)取消恢复上一个活动目录的pushd命令

  4. 多个文件夹中的多个web.config个文件

    遵循@Dominique指出的approach(复制,清理,恢复)

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        pushd "c:\users\data" && >nul 2>nul (
            for %%t in ("%temp%\%~n0_%random%%random%%random%.tmp") do (
                robocopy . "%%~ft" web.config /s
                robocopy "%%~ft" . /mir
                rmdir "%%~ft" /s /q
            ) 
            popd
        )
    

    代码将

    1. pushd)更改为目标文件夹(我们需要确保这只会从目标位置删除信息)。如果命令可以更改为文件夹,则

    2. for)准备一个临时文件夹(随机名称)

    3. robocopy)仅将web.config个文件(及其文件夹层次结构)从源文件夹复制到临时文件夹

    4. robocopy)将临时文件夹镜像到源文件夹。这将删除临时副本中未包含的任何文件/文件夹

    5. rmdir)删除临时文件夹

    6. popd)取消恢复上一个活动目录的pushd命令

    7. 保存web.config文件后,由于源文件中的文件将与temporay文件夹中的文件匹配,因此不会使用第二个robocopy调用复制它们,但不会复制任何文件/文件夹将删除临时文件夹中不存在的源以镜像临时文件夹中的结构。

答案 1 :(得分:1)

以下是我的方式:

pushd "C:\Users\data" || exit /B 1
for /D %%D in ("*") do (
    rd /S /Q "%%~D"
)
for %%F in ("*") do (
    if /I not "%%~nxF"=="web.config" del "%%~F"
)
popd

基本代码取自我对问题Deleting Folder Contents but not the folder的回答,但del命令被第二个for循环替换,该循环遍历所有文件并仅删除那些未命名的文件web.config {1}}。

请注意,此方法不会触及原始父目录,也不会触及原始文件web.config 。这个事实的巨大优势是没有属性会丢失(例如,创建日期和所有者)。

解释

  • pushd更改为根目录;如果失败,请跳过脚本的其余部分;
  • 通过for /D循环遍历根的所有直接子文件夹,并rd /S以及其所有内容递归删除它们;
  • 通过标准for循环遍历位于根目录中的文件;使用循环变量的~nx修饰符扩展每个文件的基本名称(n)和扩展名(x),将其与给定的文件名(if)进行比较以不区分大小写的方式(/I)并仅在文件不匹配的情况下按del删除文件(not);
  • 最后按popd恢复以前的工作目录;

代码中的主要问题是:

  • 您将纯文件名与预先定义的名称进行比较,因此不会发现任何匹配。
  • 您需要使用不区分大小写的比较,因为Windows不关心用于搜索的文件名的大小写。
  • 您没有在比较表达式周围加上引号,因此您可能会收到语法错误消息,具体取决于文件名中出现的特殊字符。
  • 您只使用del命令删除文件;要删除目录,您还需要使用rd

答案 2 :(得分:0)

我也设法做到了,非常类似于@aschipfl

For /D %%k in (C:\Users\data) do (For /d %%m in ("%%k\*") do rmdir /s /q "%%m"
For %%m in ("%%k\*") do if not %%m == %%k\Web.config del /q "%%m")