我想知道如何创建一个bat文件,它在第一次运行时将存储系统日期,并在随后的运行中删除30天后的特定文件。我想如果可以创建一个bat文件来存储系统日期在第一次运行和第二个bat文件读取日期的第一个文件会更好。但是如何?
答案 0 :(得分:1)
正如@devio评论的那样,PowerShell绝对是功能更全面的:PowerShell Quick Reference
如果必须是批处理文件,则此reference解释了大多数命令。
答案 1 :(得分:1)
我喜欢PowerShell,它肯定比批处理文件更强大,但是对于它来说它真的很重要,所以如果你对批处理文件感到满意,你应该能够坚持使用它们。
你以后能够恢复该日期的唯一方法是将它存储在某个地方(或者让你的任务在整个时间内运行,这是不现实的 - 想想重启其他事情)
您可以将删除日期写入注册表或文本文件或其他“已知”的文件,但是您需要运行其他内容来检查“是否有时间采取行动”。
我倾向于在原始脚本中为删除创建一个计划任务,这样我就不必检查它了。你甚至可以让你安排的删除脚本在完成任务时清理它。
答案 2 :(得分:0)
您可以使用类似于windowscripting主机vb脚本或js脚本文件的内容。此外,脚本语言(如php,python或perl)可以让您轻松地执行此类操作,并且可能比shell脚本提供更大的灵活性。
答案 3 :(得分:0)
回答这个问题需要一段时间,但这是第一件事。
如果你想要一个单独的.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)。
现在如何做日期算术需要一些时间来弄明白。我希望这至少可以让你开始朝着正确的方向前进。
答案 4 :(得分:0)
安装完成后我的设置会运行一个bat文件(一次),它应该获得系统日期(安装日期)并存储在一个文本文件中。主程序将被另一个读取文本的批处理文件调用每次提交日期文件,帮助它在文本文件中引用安装日期的“N”天后删除特定文件。
答案 5 :(得分:0)
VBScript,PowerShell或C#(我使用CS-Script来运行我的C#脚本)将很多更清洁 - 但有时我会喜欢一些批处理文件挑战。
所以 - 这是从当前日期和时间开始的1个月,但它会给你一个想法。实际上要算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!
请注意,这不会适当地处理年度更改(它将在年度更改时删除)。
答案 6 :(得分:0)
HI MARK BRACKETT, 当我运行batch1时,日期是MM \ DD \ YYYY.But当我运行batch2时,startdate是DD,startmonth也是DD。最后的等式是如果rundate == nowdate执行命令,它应该是rundate => nowdate,如果pc没有打开rundate.secondly月31天,rundate将下个月31日