Batch file 批处理命令,从文件夹中删除除一个文件外的所有内容(子文件夹和文件)

Batch file 批处理命令,从文件夹中删除除一个文件外的所有内容(子文件夹和文件),batch-file,cmd,Batch File,Cmd,首先,类似的问题在过去也有过回答,但与我的回答不完全一样。在其他一些解决方案中,建议隐藏文件夹/文件和更改属性,我不希望这样,除非没有更简单的方法可用。此外,我还尝试了这里建议的解决方案(以及其他几个): 但由于两个原因,无法满足我的需要: 这也删除了文件,我不想 这不会删除子文件夹,而只删除文件 因此,我有文件夹c:/users/data,其中有5个文件夹和6个文件,我想删除除web.config之外的所有内容,为此,我运行批处理文件,如下所示: @echo off for %%j in (C

首先,类似的问题在过去也有过回答,但与我的回答不完全一样。在其他一些解决方案中,建议隐藏文件夹/文件和更改属性,我不希望这样,除非没有更简单的方法可用。此外,我还尝试了这里建议的解决方案(以及其他几个):

但由于两个原因,无法满足我的需要:

  • 这也删除了文件,我不想
  • 这不会删除子文件夹,而只删除文件
  • 因此,我有文件夹
    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
    开关,则它只删除文件夹而不是文件。如何删除文件和文件夹?

    我不确定web.config文件存储在哪里,或者是否有多个,因此

    只有一个
    web.config
    文件

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

    @echo关闭
    setlocal enableextensions disabledelayedexpansion
    pushd“c:\users\data”&&&>NUL2>nul(
    nul 2>nul(
    对于%%t in(“%temp%\%~n0\%random%%random%%random%%random%.tmp”)执行以下操作(
    机器人副本。“%%~ft”web.config/s
    机械人“%%~英尺”。/mir
    rmdir“%%~ft”/s/q
    ) 
    邻苯二胺
    )
    
    代码将

  • pushd
    )更改到目标文件夹(我们需要确保这将仅从指定位置删除信息)。如果命令可以更改到该文件夹,则

  • (的
    )准备对临时文件夹的引用(随机名称)以供使用

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

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

  • rmdir
    )删除临时文件夹

  • popd
    )取消恢复上一个active directory的
    pushd
    命令


  • 保存
    web.config
    文件后,由于源文件中的文件将与临时文件夹中的文件匹配,因此不会使用第二次
    robocy
    调用将其复制回,但源文件中临时文件夹中不存在的任何文件/文件夹将被删除,以镜像临时文件夹中的结构。

    重新设置web.config文件的存储位置,或者如果存在多个文件,那么

    只有一个
    web.config
    文件

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

    @echo关闭
    setlocal enableextensions disabledelayedexpansion
    pushd“c:\users\data”&&&>NUL2>nul(
    nul 2>nul(
    对于%%t in(“%temp%\%~n0\%random%%random%%random%%random%.tmp”)执行以下操作(
    机器人副本。“%%~ft”web.config/s
    机械人“%%~英尺”。/mir
    rmdir“%%~ft”/s/q
    ) 
    邻苯二胺
    )
    
    代码将

  • pushd
    )更改到目标文件夹(我们需要确保这将仅从指定位置删除信息)。如果命令可以更改到该文件夹,则

  • )准备对临时文件夹的引用(随机名称)以供使用

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

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

  • rmdir
    )删除临时文件夹

  • popd
    )取消恢复上一个active directory的
    pushd
    命令


  • 保存
    web.config
    文件后,由于源文件中的文件将与临时文件夹中的文件匹配,因此不会使用第二次
    robocy
    调用将其复制回,但源文件中临时文件夹中不存在的任何文件/文件夹将被删除,以镜像临时文件夹中的结构。

    以下是e我会这样做:

    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
    
    基本代码取自我对问题的回答,但用
    del
    命令替换为第二个
    for
    循环,该循环遍历所有文件并仅删除未命名的
    web.config

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

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

    代码中的主要问题有:

    • 与纯文件名和
      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")