我正在试用和错误处理一个琐碎的批处理脚本:
我需要执行.bat并让它遍历当前目录中的所有文件,并删除除自身和其他两个文件之外的所有文件(和子文件夹)。
这样做是可行的:
@echo off
for /f %%f in ('dir /b c:\d\test') do (del %%f)这并不是:
@echo off
for /f %%f in ('dir /b c:\d\test') do (if (true) (del %%f))为什么?(代替“如果(真)”,我想说“如果不是文件名=‘foo’或文件名=‘bar’”等等)
很多人谢谢你
编辑: @rangerchris,完美,谢谢。现在,如何在迭代中包括文件夹和子文件夹?
发布于 2009-08-18 13:57:03
在这段代码中,Pong用所需的文件名填充“持”变量。
我想当然地认为这些文件应该在任何地方,所以在测试中我只检查name+extension,而不是路径,所以它们可以在任何子路径中。
编辑: Ok,修改后的Pong更深入的测试版本。很抱歉发布的太仓促,想帮忙,但我想我没有足够的测试我的脚本。
尽管这一次,允许我在XP批处理编程中显示一个示例或递归编程(函数:CleanDir调用自己) :)
Cleanup.cmd:
@echo off
set Keep="%~nx0" "file1.ext" "file2.ext"
set StartDir=%~dp0
call :CleanDirs "%StartDir:~0,-1%"
exit /b 0
:CleanDirs
call :CleanFiles "%~1"
for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :CleanDirs "%~1\%%~d"
if exist "%~1" rmdir /Q "%~1">nul 2>nul
exit /b 0
:CleanFiles
for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
set _keep=
for %%k in (%Keep%) do if /i "%%~nxf"=="%%~k" set _keep=yes
if not defined _keep del /f "%~1\%%~f" 2>nul
)
exit /b 0不过,希望这能帮上更多忙。
Notes
set Keep=:使用需要保留的任何文件名进行调整。脚本将保持子文件夹保存这些文件。
set StartDir=%~dp0:将独立于脚本所在的任何位置。如果要将脚本移到别处,可以使用目录名作为参数调用它,并在这里更改分配为="%~1“
编码提示
%*~*1:(Tild)删除括起来的引号。不会删除所有引号,只有一个前导/尾随。
filename+ext %~nx0:(tild Nx0)获取批处理文件的。警告,这将改变如果这是一个函数。根据需要调整。
%~dp0:(tild D p)获取批文件的drive/ path (包括跟踪baskslash () )。警告,这将改变如果这是一个函数。根据需要调整。
%StartDir:~0,-1%:(Tild Start,Stop)获取变量的一个子字符串,在这里,从0到最后一个字符减去一个位置(用于剥离尾随)。
发布于 2009-08-14 09:10:26
在命令行中,它可以在以下方面正常工作:
for %i in (*) do if not "%i" == "startgd.bat" echo %i显然,在.bat文件中将%i更改为%i。你有什么错误(如果有的话)?也许你只需要正确地使用引号(双引号而不是单引号?)
编辑:对于忽略两个文件,这是可行的:
for %i in (*) do if not "%i" == "startgd.bat" if not "%i" == "msdelog.log" echo %i编辑2基于@Pong的编辑来完成:要恢复文件夹,只需将/s开关传递给dir。所以你会得到这样的东西:
for /f %i in ('dir /s /b c:\') do if not "%i" == "C:\startgd.bat" if not "%i" == "c:\path\to\other\file" echo %i发布于 2009-08-14 09:12:57
这应该是可行的:
for /f %%f in ('dir /b c:\d\test') do (if '%%f' == 'foo' del %%f)基本上,您需要在条件测试中引用变量。
https://stackoverflow.com/questions/1276793
复制相似问题