Batch file 创建bat或脚本文件以删除文件

Batch file 创建bat或脚本文件以删除文件,batch-file,Batch File,我想知道如何创建一个bat文件,它在第一次运行时会存储系统日期,在随后的运行中会在30天后删除一个特定的文件。我想如果可以创建一个bat文件,它会在第一次运行时存储系统日期,而第二个bat文件读取日期的第一个文件会更好。但是如何创建呢?As@devio评论说,PowerShell的功能肯定更全面: 如果必须是批处理文件,这解释了大多数命令。我喜欢powershell,而且它肯定比批处理文件更强大,但对于这一点,使用什么并不重要,因此如果您对批处理文件感到满意,您应该能够坚持使用它们 您以后能够恢

我想知道如何创建一个bat文件,它在第一次运行时会存储系统日期,在随后的运行中会在30天后删除一个特定的文件。我想如果可以创建一个bat文件,它会在第一次运行时存储系统日期,而第二个bat文件读取日期的第一个文件会更好。但是如何创建呢?

As@devio评论说,PowerShell的功能肯定更全面:


如果必须是批处理文件,这解释了大多数命令。

我喜欢powershell,而且它肯定比批处理文件更强大,但对于这一点,使用什么并不重要,因此如果您对批处理文件感到满意,您应该能够坚持使用它们

您以后能够恢复该日期的唯一方法是将其存储在某个位置(或者让您的任务一直运行,这是不现实的——想想重新启动等等)

您可以将删除日期写入注册表或文本文件或其他“已知”的地方,但是您需要运行其他程序来检查“是否该采取行动”


我倾向于在原始脚本中为delete创建一个计划任务,这样我就不必检查它了。您甚至可以让您计划的删除脚本在任务完成后清理任务。

您可以使用诸如Windows脚本主机vb脚本或js脚本文件之类的内容。此外,诸如php、python或perl之类的脚本语言将允许您轻松地执行类似操作,并且可能比shell脚本提供更大的灵活性。

回答这个问题需要一些时间,但这里有一个建议

当您想要有一个单独的.BAT(或.CMD)来做一些事情,并且以后也会基于第一个东西做一些事情时,可以使用“flag参数”技术。例如,在接受要操作的通配符文件列表的脚本中,可以执行以下操作:

::foo.cmd
@echo off
if %1@==@ goto fail
set f=%1
if %1==! goto inner
for %%x in (%f%) do cmd /c %0 ! %%x
goto done
:inner
set f=%2
echo do something with %f%
goto done
:fail
echo %0 {wildcard}
:done
脚本实际上是这样编写的:它可以被调用任何东西,并且它将调用自己(使用%0)


现在,如何做日期算术将需要一些时间来解决。我希望这至少能让您从正确的方向开始。

安装完成后,我的安装程序将运行一个bat文件(一次),该文件将获得系统日期(安装日期)并存储在文本文件中。主程序将被另一个批处理文件调用,该批处理文件将每次读取文本文件的日期,以帮助它在引用文本文件中的安装日期的“N”天后删除特定文件。

VBScript、PowerShell或C#(我使用CS脚本运行我的C#脚本)会更干净-但有时我喜欢一个小批量文件的挑战

这是从当前日期和时间算起的一个月,但它给了你一个想法。要实际计算30天,我怀疑您需要大约50行IF语句。或者,使用单个外部EXE为您计算它

我认为有一种更干净的方法可以使用SET本身来分割日期部分,这将减少大约3行,但我不记得ATM的语法

Batch1
   ECHO %DATE% > start.txt

Batch2
   : Get start date
   FOR /F "tokens=1* delims= " %%i IN (start.txt) DO set startDate=%%j
   FOR /F "tokens=1,2 eol=/ delims=/ " %%i IN ('echo %startDate%') DO set startMonth=%%i
   FOR /F "tokens=1,2 delims=/ eol=/" %%i IN ('echo %startDate%') DO set startDay=%%j
   FOR /F "tokens=2,3 delims=/ " %%i IN ('echo %startDate%') DO set startYear=%%j

   : Get run month and day as YYYY-MM-DD
   SET /A runMonth=%startMonth% + 1
   IF %runMonth% LEQ 10 SET runMonth=0%runMonth%
   SET runDay=%startDay%
   SET runYear=%startYear%
   SET runDate=%runYear%-%runMonth%-%runDay%

   : Get current month and day as YYYY-MM-DD
   FOR /F "tokens=1* delims= " %%i IN ('echo %DATE%') DO set nowDate=%%j
   FOR /F "tokens=1,2 eol=/ delims=/ " %%i IN ('echo %nowDate%') DO set nowMonth=%%i
   FOR /F "tokens=1,2 delims=/ eol=/" %%i IN ('echo %nowDate%') DO set nowDay=%%j
   FOR /F "tokens=2,3 delims=/ " %%i IN ('echo %nowDate%') DO set nowYear=%%j
   SET nowDate=%nowYear%-%nowMonth%-%nowDay%

   : Compare
   IF %nowDate% GEQ %runDate% ECHO Delete!
请注意,这不会适当地处理年份变化(它会在年份变化时删除)。

HI MARK BRACKETT,
当我运行batch1时,日期是MM\DD\YYYY。但当我运行batch2时,开始日期是DD,开始月份也是DD。最后一个等式是如果rundate==nowdate execute命令,它应该是rundate=>nowdate,原因:如果pc未打开rundate.Secondary months with 31 days,则rundate将在下个月31日运行

不确定是否可以使用批处理文件计算所有日期。我建议您尝试使用PowerShell,而不是当我运行batch1时,日期是MM\DD\yyyyy。但是当我运行batch2时,开始日期是DD,开始月份也是DD。最后一个等式是如果rundate==nowdate execute命令,它应该是rundate=>nowdate,因为如果pc没有打开rundate。第二个月加上31天,运行日期将在下个月31日。其中一个%%j应该是%%i。startMonth现在应该可以工作了…我会考虑修复GEQ部分。不过请注意有关年份转换的评论。