首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理脚本

批处理脚本
EN

Stack Overflow用户
提问于 2009-08-14 09:00:10
回答 3查看 1.6K关注 0票数 0

我正在试用和错误处理一个琐碎的批处理脚本:

我需要执行.bat并让它遍历当前目录中的所有文件,并删除除自身和其他两个文件之外的所有文件(和子文件夹)。

这样做是可行的:

代码语言:javascript
复制
@echo off
for /f %%f in ('dir /b c:\d\test') do (del %%f)

这并不是:

代码语言:javascript
复制
@echo off
for /f %%f in ('dir /b c:\d\test') do (if (true) (del %%f))

为什么?(代替“如果(真)”,我想说“如果不是文件名=‘foo’或文件名=‘bar’”等等)

很多人谢谢你

编辑: @rangerchris,完美,谢谢。现在,如何在迭代中包括文件夹和子文件夹?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-18 13:57:03

在这段代码中,Pong用所需的文件名填充“持”变量。

我想当然地认为这些文件应该在任何地方,所以在测试中我只检查name+extension,而不是路径,所以它们可以在任何子路径中。

编辑: Ok,修改后的Pong更深入的测试版本。很抱歉发布的太仓促,想帮忙,但我想我没有足够的测试我的脚本。

尽管这一次,允许我在XP批处理编程中显示一个示例或递归编程(函数:CleanDir调用自己) :)

Cleanup.cmd:

代码语言:javascript
复制
@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到最后一个字符减去一个位置(用于剥离尾随)。

票数 1
EN

Stack Overflow用户

发布于 2009-08-14 09:10:26

在命令行中,它可以在以下方面正常工作:

代码语言:javascript
复制
for %i in (*) do if not "%i" == "startgd.bat" echo %i

显然,在.bat文件中将%i更改为%i。你有什么错误(如果有的话)?也许你只需要正确地使用引号(双引号而不是单引号?)

编辑:对于忽略两个文件,这是可行的:

代码语言:javascript
复制
for %i in (*) do if not "%i" == "startgd.bat" if not "%i" == "msdelog.log" echo %i

编辑2基于@Pong的编辑来完成:要恢复文件夹,只需将/s开关传递给dir。所以你会得到这样的东西:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2009-08-14 09:12:57

这应该是可行的:

代码语言:javascript
复制
for /f %%f in ('dir /b c:\d\test') do (if '%%f' == 'foo' del %%f)

基本上,您需要在条件测试中引用变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1276793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档