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")