如何删除与执行的文件位于同一文件夹中的.bat文件.bat文件(而不删除已执行的文件)?



在制作批处理文件时,我想在名称中添加一个版本号,这样新版本就不会被旧版本替换。我希望新版本做的是删除所有旧版本,因此作为示例,让我们以一个名为apps的文件夹为例,其中有Test (v1).batTest (v2).batTest (v3).bat。我想Test (v3).bat首先做的是删除Test (v1).batTest (v2).bat,我知道你此时可能在想什么:

你为什么不直接添加行(del"Test (v1(.bat"(和(del "Test (v2(.bat"(?

这不是我想要的,因为让我们说过一会儿我做了Test (v4).bat并希望它删除所有以前的版本(如果存在(。显然,如果我必须不断添加并且不要忘记添加del "Test (v№).bat",它不会非常优化。如果我del "*.bat"做这样的事情,那么所有扩展名为.bat的文件都将被删除,即使是当前执行的文件,所以这无济于事。我也想要它,所以如果执行旧版本,那么它不会删除较新版本(如果执行Test (v2).bat不要删除Test (v3).batTest (v4).bat等,而是删除Test (v1).bat(

它取决于有一个严格的命名标准,不会被某人选择(这样的假设是许多安全和恶作剧攻击的核心,所以要小心(。

这是假设当前批处理文件已经符合您的问题所暗示的命名标准而编写的。 我没有对此进行安全编码,以避免在文件不合规的情况下发生自杀式横冲直撞;你可以自己做。 :-)

此外,在这种情况下goto ENDIT是多余的,但如果您有其他代码要添加,或子例程,或者您有什么,这是我在所有批处理文件中所做的安全最佳实践。 您可以同时删除goto ENDIT:ENDIT标签,以实现微小的性能改进。

echo del更改为del,一旦您确认这件事不会以意想不到的方式杀死您。

@echo off
set PUR_CURFNM=
for /F "usebackq tokens=*" %%F in ('%0') do set PUR_CURFNM=%%~F
for %%F in ("%PUR_CURFNM%") do set PUR_FULFNM=%%~dpnxF
for %%F in ("%PUR_CURFNM%") do set PUR_BASBNM=%%~dpnF
set PUR_BASFNM=
for /F "tokens=1 delims=(" %%A in ("%PUR_BASBNM%") do set PUR_BASFNM=%%A
for %%F in ("%PUR_BASFNM%(v*).bat") do if /I "%%F" NEQ "%PUR_FULFNM%" echo del "%%F"
goto ENDIT
:ENDIT
set PUR_FULFNM=
set PUR_CURFNM=
set PUR_BASBNM=
set PUR_BASFNM=

不过,我和@Compo在一起;这是一种奇怪的要求。 玩得开心。 :-)

最新更新