BAT批处理(二):批量删除指定文件以及相关简单的语法结构(系统变量errorlevel,变量延迟等)

BAT批处理(二):批量删除指定文件以及相关简单的语法结构(系统变量errorlevel,变量延迟等)

前两天在使用 VSCode 的时候,看到之前那么多 cpp 编译产生的 exe 可执行文件,于是心生一个念头,我要把它们全部删掉,但是又不想一个个地删,便想到了利用 bat 脚本批量删除 exe 文件。于是在搜集了大量资料后,开始了编写。
首先就是一条简单的 del

del F:\Code\C++\*.exe

但是发现只能删除掉 C++ 那个文件夹根目录下的 exe 文件,然后发现,在后面加上 /s,表示在当前目录递归删除指定文件,就是还要进入子目录寻找文件。

/a 根据百属性选择要删除的文件
/f 强制删除只读度文件
/s 从所有子目录删除指定文件
/q 安静模式。删除全局通配符时,不要求确知

del F:\Code\C++\*.exe /s

运行之后,哗啦啦,全删掉了(在其他盘里测试一下):
在这里插入图片描述
本来其实这样就可以了,把这个批处理脚本放到 C++ 文件夹根目录就行了,但是如果多次执行的时候,本来已经没有 exe 文件了,还要执行,就会提示 找不到 G:\test\*.exe,对于强迫症的我当然不能忍受起码提示一个 exe文件已经删完啦 之类的。要这样写势必要进行条件判断,然后,又去找了很多资料。
一开始搜到一个 errorlevel 的系统变量,会判断你当前这条语句是否执行,如果成功执行该变量的值为 0, 否则是 1-255 之间的某一个值,这里的值主要是根据语句未能成功执行的原因(其实就是跟中断类型差不多)来决定的,一般是 1

@echo off 
if ERRORLEVEL 1 goto fail
if ERRORLEVEL 0 goto success
goto done
:fail
echo exe文件已经没有啦,别删啦~
goto done
:success
echo 正在删除所有烦人的exe文件...
del F:\Code\C++\*.exe /s
:done
echo 执行完成

运行后发现了中文乱码,于是改一下编码为 ANSI在这里插入图片描述
然后再次执行,发现不管 exe 文件是否被删掉,都会执行 success 标号的语句,说明 del 语句都被执行了,只是找不到文件而已。
在这里插入图片描述
这种方法不行那就试试其他方法,用 if exist 条件判断应该可以吧

@echo off 
::if ERRORLEVEL 1 goto fail
::if ERRORLEVEL 0 goto success
if exist F:\Code\C++\*.exe (goto success) else (goto fail)
goto done
:fail
echo exe文件已经没有啦,别删啦~
goto done
:success
echo 正在删除所有烦人的exe文件...
del F:\Code\C++\*.exe /s
:done
echo 执行完成

这里的 ::是注释,当然注释还有其他写法

1、:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)
2、rem 注释内容(不能出现重定向符号和管道符号)
3、echo 注释内容(不能出现重定向符号和管道符号)〉nul
4、if not exist nul 注释内容(不能出现重定向符号和管道符号)
5、:注释内容(注释文本不能与已有标签重名)
6、%注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)
7、goto 标签 注释内容(可以用作说明goto的条件和执行内容)
8、:标签 注释内容(可以用作标签下方段的执行内容

完美执行。
然后在之后的其他测试中,若 C++ 根目录下没有 exe 文件,而在其子文件夹下有 exe 文件的话,就出问题了,因为 if exist 那行语句只是判断当前文件夹根目录下是否存在 exe 文件。那该怎么办呢?
应该要对 C++ 根目录进行递归查找,便是 for 语句:

@echo off
cls
set PATH=F:\Code\C++\
set FILE=*.exe	
set cnt=0
for /R %PATH% %%s in (%FILE%) do (
	::echo %%s
	set /a cnt=%cnt%+1
)
echo 删除了%cnt%个文件!
if %cnt% EQU 0 (goto fail) else (goto success)
goto done
:fail
echo exe文件已经没有啦,别删啦~
goto done
:success
echo 正在删除所有烦人的exe文件...
del *.exe /s
echo 删除了%cnt%个文件!
goto done
:done
echo 执行完成

for 循环后面的 /R 便是对当前文件夹进行递归查找,若存在后缀名为 .exe 文件,便把计数值+1.然后运行,又出错了。。。
cnt的值始终为1,这又是为什么呢?
又查了许多资料,发现 批处理语法中还有叫什么 变量延迟 的语法,具体就是 当我们准备执行一条命令的时候,命令解释器会先将命令读取,如果命令中有环境变量,那么就会将变量的值先读取来出,然后在运行这条命令,如:echo %cnt%,当我们执行这条命令的时候,命令解释器会先读出 %cnt% 的值,然后执行echo,得到的结果是屏幕上显示出 cnt的值。但是,有的时候,我们在执行一条命令的时候,命令解释器将环境变量的值读出来以后,我们的环境变量的值发生了改变,这时个再执行命令就是使用的变量改变前的值,这就不是我们想要的结果了。
也就是,当 for 语句执行时,命令解释器首先把它变成

for /R %s in (*.exe) do (set /a cnt=0+1 )

因此在这个循环里面 cnt 就全是0了,这里我们就需要用到 变量延迟 了,设置 setlocal enabledelayedexpansion,然后将需要使用变量延迟的变量两边用 ! 表示,即 set /a cnt=!cnt!+1.
关闭变量延迟的话就是 setlocal disabledelayedexpansion.
全部修改完了 bat 程序如下:

@echo off
cls
setlocal enabledelayedexpansion
set PATH=F:\Code\C++\
set FILE=*.exe	
set cnt=0
for /R %PATH% %%s in (%FILE%) do (
	::echo %%s
	set /a cnt=!cnt!+1
)
if %cnt% EQU 0 (goto fail) else (goto success)
goto done
:fail
echo exe文件已经没有啦,别删啦~
goto done
:success
echo 正在删除所有烦人的exe文件...
del %PATH%%FILE% /s
echo 删除了%cnt%个文件!
goto done
:done
echo 执行完成
endlocal

大功告成!!

### 回答1: 您可以使用Windows的批处理命令(.bat)来查找含有特定关键词的txt文件,并将其移动到指定文件夹下。 示例代码: ``` @echo off set keyword=关键词 set source_folder=C:\source_folder set target_folder=C:\target_folder for /f "tokens=*" %%a in ('dir /b /s %source_folder%\*.txt') do ( findstr /i "%keyword%" "%%a" if %errorlevel%==0 ( move "%%a" %target_folder% ) ) ``` 上面的代码将在C:\source_folder文件夹及其子文件夹下搜索所有后缀为txt的文件,如果文件中含有关键词,就将文件移动到C:\target_folder文件夹下。 请注意在实际运行中,您需要将关键词和文件夹路径替换为您所需的实际值。 ### 回答2: bat文件是Windows操作系统中的批处理文件,可以用于自动化执行一系列命令。在bat文件中实现关键词查找、文件移动的功能,可以通过以下步骤进行: 步骤一:指定要查找的文件夹和关键词 使用变量来存储文件夹路径和关键词,例如: set folder=C:\目标文件夹路径 set keyword=关键词 步骤:遍历文件夹及其子文件夹 通过for /r命令遍历指定文件夹及其子文件夹下的所有文件,例如: for /r %folder% %%a in (*.txt) do ( REM 在这里编写代码 ) 步骤三:查找含有关键词的文件 使用findstr命令配合管道符号(|)将文件内容和关键词进行匹配,例如: type "%%a" | findstr /c:"%keyword%" >nul 如果匹配成功,则执行下一步骤;否则跳过。 步骤四:移动文件指定文件夹下 使用move命令将符合条件的文件移动到指定文件夹下,例如: move "%%a" C:\指定文件夹路径 最终的bat脚本模板如下所示: @echo off set folder=C:\目标文件夹路径 set keyword=关键词 for /r %folder% %%a in (*.txt) do ( type "%%a" | findstr /c:"%keyword%" >nul if %errorlevel%==0 ( move "%%a" C:\指定文件夹路径 ) ) 在bat文件中使用以上步骤的代码实现了关键词查找和文件移动的功能。请根据实际需求修改对应的文件夹路径和关键词,并将代码保存为bat文件后执行。 ### 回答3: 通过编写一个脚本或使用命令行操作,我们可以实现通过bat批处理程序查找txt中的关键词,查找含有关键词的文件并将其移动到指定文件夹下。 首先,我们需要使用findstr命令来查找包含关键词的txt文件。在bat文件中,我们可以使用类似下面的命令来查找关键词"keyword": findstr /i "keyword" *.txt 这条命令将会在当前目录下的所有txt文件中查找包含关键词"keyword"的行,并将结果输出到命令行窗口。 接下来,我们需要将查找到的文件移动到指定文件夹下。我们可以使用move命令来实现这个功能。在bat文件中,我们可以使用类似下面的命令来将文件移动到指定文件夹"C:\目标文件夹"下: move "源文件路径" "C:\目标文件夹" 通过将上述两个命令结合起来,我们可以编写一个bat文件以实现我们的目标。以下是一个示例: @echo off set keyword=关键词 set destination=C:\目标文件夹 for /r %%f in (*.txt) do ( findstr /i "%keyword%" "%%f" > nul if %errorlevel% equ 0 ( move "%%f" "%destination%" ) ) 这个bat文件首先设置了一个变量keyword,用于存储关键词。然后设置了一个变量destination,用于存储目标文件夹路径。 接下来,使用一个for循环遍历当前目录下的所有txt文件。在循环中,首先使用findstr命令查找包含关键词的行。如果找到了关键词,findstr命令会返回0,将文件移动到目标文件夹。 注意:在实际应用中,你需要将关键词和目标文件夹的路径替换为你自己的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值