在制作批处理文件时,我考虑在名称中添加版本号,以便新版本不会被旧版本替换。我希望新版本执行的操作是删除所有旧版本,因此,举个例子,我们可以选择一个名为apps
的文件夹,其中包含Test (v1).bat
,Test (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).bat
,Test (v4).bat
等,但是删除Test (v1).bat
)
答案 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在一起;这是一种奇怪的要求。玩得开心。 : - )