首先,类似的问题在过去得到了回答,但并不完全是我所拥有的问题。在其他一些解决方案中,建议隐藏文件夹/文件和更改属性,我不希望这样,除非没有更简单的方法。此外,我尝试了此处建议的解决方案(以及其他几个):MS-DOS command to delete all files except one。
但由于两个原因,我的工作无效:
所以,我有文件夹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
开关,则只会删除文件夹不是文件。如何删除文件和文件夹?
答案 0 :(得分:1)
我不确定web.config文件的存储位置或者是否有多个,所以......
只有一个web.config
文件
只需锁定文件(将文件重定向为输入)并删除其他任何内容
@echo off
setlocal enableextensions disabledelayedexpansion
pushd "c:\users\data" && >nul 2>nul (
<"web.config" rmdir . /s /q
popd
)
代码将
(pushd
)更改为目标文件夹(我们需要确保这只会从目标位置删除信息)将其设置为当前活动目录并锁定它(我们无法删除当前活动目录)。如果命令可以更改为文件夹,则
(rmdir
)将web.config
重定向为rmdir
命令的输入。这将锁定文件,以便在命令结束之前不能删除它。 rmdir . /s /q
删除未锁定在当前活动目录(及其下方)内的任何内容
(popd
)取消恢复上一个活动目录的pushd
命令
多个文件夹中的多个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
)
代码将
(pushd
)更改为目标文件夹(我们需要确保这只会从目标位置删除信息)。如果命令可以更改为文件夹,则
(for
)准备一个临时文件夹(随机名称)
(robocopy
)仅将web.config
个文件(及其文件夹层次结构)从源文件夹复制到临时文件夹
(robocopy
)将临时文件夹镜像到源文件夹。这将删除临时副本中未包含的任何文件/文件夹
(rmdir
)删除临时文件夹
(popd
)取消恢复上一个活动目录的pushd
命令
保存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
恢复以前的工作目录; 代码中的主要问题是:
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")