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

时间:2017-08-17 20:57:08

标签: batch-file cmd delete-file

在制作批处理文件时,我考虑在名称中添加版本号,以便新版本不会被旧版本替换。我希望新版本执行的操作是删除所有旧版本,因此,举个例子,我们可以选择一个名为apps的文件夹,其中包含Test (v1).batTest (v2).bat& Test (v3).bat。我希望Test (v3).bat在删除任何内容之前执行的操作Test (v1).bat& Test (v2).bat,我知道你现在在想什么:

  

为什么不添加这些行(del" Test(v1).bat")& (del"测试(v2).bat")?

这不是我想要的,因为我们暂时说出Test (v4).bat并希望它删除以前的所有版本(如果它们存在)。显然,如果我不断添加&别忘了添加del "Test (v№).bat"。如果我执行此类del "*.bat"之类的操作,那么所有带有.bat扩展名的文件都将被删除,即使是当前执行的文件也是如此,因此无法提供帮助。我也想要它,所以如果执行旧版本,那么它不会删除更新的版本(如果Test (v2).bat被执行,请不要删除Test (v3).batTest (v4).bat等,但是删除Test (v1).bat

1 个答案:

答案 0 :(得分:0)

这取决于拥有严格的命名标准,而这种标准不会被某人加入(这种假设是许多安全和恶作剧攻击的核心,所以要小心)。

假设当前批处理文件已符合您的问题隐含的命名标准,则编写此文件。我没有对此进行安全编码,以避免在文件不合规的情况下出现自杀横行;你可以为自己做到这一点。 : - )

此外,在这种情况下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在一起;这是一种奇怪的要求。玩得开心。 : - )