tags:

views:

2235

answers:

8

I would like to know how to create a bat file which on its first run would store the system date and on subsequent run delete a particular file 30 days later.I think if a bat file can be created that would store system date on its first run and the second bat files reads the first file for the date would be better.But how?

+1  A: 

As @devio commented, PowerShell is definitely more fully featured: PowerShell Quick Reference

If it has to be a Batch file, this reference explains most commands.

Mitch Wheat
+1  A: 

I love powershell, and it is certainly more powerful than batch files, but for this it shouldnt really matter what you use, so if you're comfortable with your batch files you should be able to stick with them.

The only way you'll be able to later recover that date is to store it somewhere (or have your task running the whole time which is unrealistic - think reboots among other things)

You could write the deletion date to the registry or a text file or somewhere else that is 'known', but then you need to have something else running to check 'if its time to act'.

I'd be inclined to just create a scheduled task for the delete during the original script so that I wouldn't have to check up on it. You could even have the delete script you've scheduled clean up the task when it's done.

A: 

You could use something like a windowscripting host vb script or js script file. Also scripting languages such as php, python or perl would allow you to do something like this easily and possibly give you much greater flexibility than a shell script.

Toby Allen
A: 

It's going to take a while to answer this one, but here's the first thing to suggest.

When you want to have a single .BAT (or .CMD) which does something and also does something later based on the first something, one can use the "flag parameter" technique. For example, in a script which accepts a wildcarded list of files to manipulate one could do as follows:

::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

The script is actually written such that it can be called anything, and it will call itself (using %0).

Now how to do date arithmetic is going to take some time to figure out. I hope that much at least gets you started in the right direction.

boost
A: 

my setup after after completion of installation would run a bat file(once) that should get the system date(install date) and store in a text file.the main program would be called by another batch file that would read the text file every time for the date assisting it to delete particular files after "N" number of days referencing the install date in the text file.

A: 

VBScript, PowerShell, or C# (I use CS-Script to run my C# scripts) would be much cleaner - but sometimes I enjoy a little batch file challenge.

So - this is for 1 month from the current date and time, but it gives you the idea. To actually figure 30 days, I suspect you'd need about 50 lines of IF statements. Or, a single external EXE to calculate it for you.

I think there's a cleaner way to use SET itself to split out the date parts, which would cut this down by about 3 lines - but I don't recall the syntax 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!

Note that this doesn't handle year changes appropriately (it'll delete on the year change).

Mark Brackett
when I run batch1 the date is MM\DD\YYYY.But when I run batch2 the startdate is DD and the startmonth is also DD.The final equation is if rundate==nowdate execute command,it should be rundate=>nowdate,cause if pc not switched on rundate.secondly months with 31days the rundate would 31st next month
Whoops. One of those %%j should've been a %%i. The startMonth should work now...I'll think about the GEQ part
Mark Brackett
A: 

HI MARK BRACKETT, when I run batch1 the date is MM\DD\YYYY.But when I run batch2 the startdate is DD and the startmonth is also DD.The final equation is if rundate==nowdate execute command,it should be rundate=>nowdate,cause if pc not switched on rundate.secondly months with 31days the rundate would 31st next month

Fixed. Though note the comment about year changeovers.
Mark Brackett
A: 

Thanks Mark your answer was the best suited for my needs.Sorry for the delay.

Dario Dias