批量删除文件并保留子目录中的最新文件

时间:2017-07-07 16:44:27

标签: batch-file

我想在"服务"中搜索特定的文件名[* dwg]。文件夹并删除所有文件,但最新的文件:

  • G:\备份\所有者\ PROJECT1 \服务
  • G:\备份\所有者\ Project2的\服务
  • G:\备份\所有者\项目3 \服务

这是我迄今为止从各种搜索中编译的内容,但是还没有能够在子目录中进行搜索。任何帮助或提示我指向正确的道路将是真正的赞赏!

@echo off &setlocal 
set folder=G:\Backup\Owner
pushd "%folder%"
for /f "skip=1 tokens=*" %%i in ('dir /s /a:-d-s /o:-d *.DWG') do @del "%%i"
popd
pause

1 个答案:

答案 0 :(得分:0)

第一个也是最重要的问题:

@del更改为ECHO del

这只是报告建议的删除,而不是实际执行删除。

注意:命令之前的@只会抑制命令日志记录。执行@echo off后,这是多余的。

现在解决(我想)离开最新1目录的问题。

dir /s /B /a:-d /o:-d *.DWG

生成一个目录列表,其中没有目录名(/ a-d),只有文件名的反向日期顺序(/ o-d)(/ b)递归到子目录(/ s)。选项中的冒号是可选的,情况无关紧要。 filemask * .dwg means "all names ending in。dwg`“(再次,案例无关紧要)

这将产生类似

的列表
d:\dirname\subdir\latest.dwg
d:\dirname\subdir\2ndlatest.dwg
d:\dirname\subdir\3rdlatest.dwg
d:\dirname\subdir2\latest.dwg
d:\dirname\subdir2\2ndlatest.dwg
d:\dirname\subdir2\3rdlatest.dwg

该项目似乎只留下任何子目录中的第一个,所以我们需要一个开关告诉我们子目录已经改变。

%%~pi提供了%%i的路径名,因此我们可以检测到其中的更改。

我们可以通过set将变量设置为井,1和0或Y和N或其他任何 - 两个不同的值来轻松设置标记。

我们遇到的困难是解释标志,因为delayed expansion问题(使用顶部栏中的设施搜索SO以获取有关此内容的许多项目)

我通过将标志变量设置为某事 nothing 来绕过delayedexpansion问题,因为这样,{{1}可以解释它们},它对变量的运行时值进行操作,而不是初始值。

因此,

if defined

您需要更改@ECHO Off SETLOCAL SET "sourcedir=U:\sourcedir" pushd "%sourcedir%" set "lastdir=" for /f "tokens=*" %%i in ('dir /s /B /a:-d /o:-d *.DWG') do ( CALL SET "keepflag=%%lastdir:%%~pi=%%" if NOT defined keepflag ECHO del "%%i" set "lastdir=%%~pi" ) popd GOTO :EOF 的设置以适合您的具体情况。

sourcedir首先设置为 nothing ,然后lastdir循环将依次找到的每个名称分配给for

%%i指令绕过call set并执行delayed expansion,其中SET "keepflag=%lastdir:%%~pi=%"已被%%~pi的路径替换。这会将%%i设置为[最后一个目录已处理替换文件名路径 nothing ]的结果,这将是如果目录名匹配则总共 nothing ,如果不匹配则

因此,如果keepflag包含 nothing ,则目录名更改,因此我们需要删除该文件(或keepflag删除测试期间的安全指令)。如果ECHO设置为某事,则这是新目录中的第一个文件,因此我们通过不执行keepflag来保留它。

然后我们只需将del设置为文件lastdir中的路径名。这样,同一目录中的另一个文件名将%%i设置为 nothing ,但更改目录会将keepfile设置为某些。< / p>