我正在试用和错误的一个简单的批处理脚本:
我需要执行.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))
为什么呢? (代替“if(true)”我想说“if not filename =='foo'或filename =='bar'”等)
非常感谢你
编辑: @rangerchris,完美,谢谢。现在如何在迭代中包含文件夹和子文件夹?
答案 0 :(得分:1)
Pong,在此代码中,使用所需的文件名填充“Keep”变量。
我理所当然地知道那些文件可以在任何地方,所以在测试中我真的只检查名称+扩展名,而不是路径,所以它们可以在任何子路径中。
编辑:好的,为Pong修改了经过深度测试的版本。很抱歉发帖太匆匆,想帮忙,但我猜我没有足够的测试我的脚本。
虽然这一次,允许我在XP批处理编程中展示一个示例或递归编程(函数:CleanDirs调用自身):)
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
不过,希望这会有所帮助。
<强> 备注 强>
设置Keep = :使用您需要保留的任何文件名进行调整。该脚本将保留子文件夹中的文件。
设置StartDir =%~dp0 :将自己调整到脚本所在的位置。如果要将脚本移动到其他位置,可以使用目录名称作为参数调用它,并在此处将分配更改为 =“%〜1”
编码提示
%*〜* 1 :( Tild)删除封闭的引号。不会删除所有引号,只会删除一个前导/尾随。
%~nx0 :( tild n x)获取批处理文件的文件 n ame + e x t。警告,如果将其放入函数中,则会发生变化。根据需要进行调整。
%~dp0 :( tild dp)获取 d rive / full p ath(包括批处理文件的尾随baskslash(\)) 。警告,如果将其放入函数中,则会发生变化。根据需要进行调整。
%StartDir: ~0,-1 % :( Tild Start,Stop)获取变量的子字符串,此处从位置0到最后一个字符减去一个位置(用于剥离尾随\)。
答案 1 :(得分:0)
从命令行,它可以正常使用:
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
答案 2 :(得分:0)
这应该有效:
for /f %%f in ('dir /b c:\d\test') do (if '%%f' == 'foo' del %%f)
基本上,您需要在条件测试中引用变量。