我想在"服务"中搜索特定的文件名[* dwg]。文件夹并删除所有文件,但最新的文件:
这是我迄今为止从各种搜索中编译的内容,但是还没有能够在子目录中进行搜索。任何帮助或提示我指向正确的道路将是真正的赞赏!
@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
答案 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>