Link to home
Start Free TrialLog in
Avatar of GPSPOW
GPSPOWFlag for United States of America

asked on

Add Month End date to COPY command

I am trying to add the previous month's end to the title of a file I am creating using the COPY command.

I have this command syntax that appends the current day.  What can I change to make it the previous month's end data?

%date:~10,4%%date:~4,2%%date:~7,2%

Thank you

Glen
Avatar of Steve Knight
Steve Knight
Flag of United Kingdom of Great Britain and Northern Ireland image

The easiest way to get the end of last month is to take the first of this month and take one off it.  I would use a little bit of VBScript to help here as it understands dates natively.  Otherwise you would have to take into account how many days in each month and leap years etc.  Do-able but bit OTT in batch.  My article mentioned below shows how to get the different parts of the date etc. if wanted:

@echo off
REM Use VBScript to get date.  This will get the first day of this month and take one off to get last day of last month
REM See http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/MS_DOS/A_1153-Using-dates-in-batch-files-scripts.html
(echo eolm=dateserial^(year^(date^),month^(date^),1^)-1
echo wscript.echo year^(eolm^) ^& right^(100 + month^(eolm^),2^) ^& right^(100+day^(eolm^),2^)) > "%temp%\dateparts.vbs"
for /f "tokens=1 delims=" %%a in ('cscript //nologo "%temp%\dateparts.vbs"') do set yyyymmdd=%%a


echo End of last month to use in filename was %yyyymmdd%

pause

Open in new window

Avatar of Bill Prew
Bill Prew

Here's a BAT subroutine that should do what you want, and returns a variable with the date required.

@echo off
call :EOM
echo %eom%
exit /b

:EOM
  setlocal
  REM Get todays date (into mm, dd, yy variables)
  for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('"echo.|date"') do (
    for /f "tokens=1-3 delims=/.- " %%A in ("%date:* =%") do (
      set "%%a=%%A" 
      set "%%b=%%B" 
      set "%%c=%%C"
    )
  )
  REM Convert month to number and decrease by 1
  set /A "mm=1%mm% - 101"
  REM If this is January, then decrease year and make month December
  if %mm% == 0 (
    set mm=12
    set /a yy-=1
  )
  REM Get the normal last day for this month
  for /F "tokens=%mm% delims=," %%A in ("31,28,31,30,31,30,31,31,30,31,30,31") do set dd=%%A
  REM See if this is a leap year, if so and it's February, add one to last day of month
  set /A "leap=%yy% %% 4"
  if %mm% == 2 if %leap% == 0 set /A "dd+=1"
  REM Return end of prior moth in eom variable in YYYYMMDD format
  endlocal & set eom=%yy%%mm%%dd%
  exit /b

Open in new window

~bp
But Bill that will break in 2100 as it isn't a leap year :-) ..... but then it probably does in VBScript too and I don't suppose we'll be using batch then!

Steve
ASKER CERTIFIED SOLUTION
Avatar of Bill Prew
Bill Prew

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of GPSPOW

ASKER

I have added billprew's solution to my batch and I am not sure if I have it correct.  I am not getting any results to the target folder.  Please review and let me know what I need to do adjust to make it work.

@echo off
call :EOM
echo %eom%
exit /b

:EOM
  setlocal
  REM Get todays date (into mm, dd, yy variables)
  for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('"echo.|date"') do (
    for /f "tokens=1-3 delims=/.- " %%A in ("%date:* =%") do (
      set "%%a=%%A"
      set "%%b=%%B"
      set "%%c=%%C"
    )
  )
  REM Convert month to number and decrease by 1
  set /A "mm=1%mm% - 101"
  REM If this is January, then decrease year and make month December
  if %mm% == 0 (
    set mm=12
    set /a yy-=1
  )
  REM Get the normal last day for this month
  for /F "tokens=%mm% delims=," %%A in ("31,28,31,30,31,30,31,31,30,31,30,31") do set dd=%%A
  REM See if this is a leap year, if so and it's February, add one to last day of month
  set /A "leap=%yy% %% 4"
  if %mm% == 2 if %leap% == 0 set /A "dd+=1"
  REM Return end of prior moth in eom variable in YYYYMMDD format
  endlocal & set eom=%yy%%mm%%dd%
  exit /b





bcp "select * from livedb.dbo.tbl_RCA_ATB_HEADERS" queryout "P:\ACCOUNTING\RCA_HEADERS.csv" -T -SPTM-DR01 -w -t^|


bcp "select * from livedb.dbo.tbl_RCA_PE_ATB_MONTHEND" queryout "P:\ACCOUNTING\RCA_ATB_ME_Temp.csv" -T -SPTM-DR01 -w -t^|

copy P:\ACCOUNTING\RCA_HEADERS.csv + P:\ACCOUNTING\RCA_ATB_ME_Temp.csv  P:\ACCOUNTING\CHI\MonthEndATB\rca_p1_mt_monthend_accts_"$eom.txt


Thanks

Glen
You'll need to insert your code instead of echo %eom%. The following exit /b stops execution of the batch file, it's the "end of batch file" command.
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Sorry, didn't see you mixed Bill's and my note. In a cmd batch file (.bat or .cmd) you will have to use %eom%, not $eom. The latter is PowerShell syntax (.ps1 file).
No doubt you used Bill's approach, so http#a39774106 should get the lion's share - ok so far.
But did you really wanted to accept http:#a39774930, which is about a PowerShell solution you did not try (presumely)? And your own comment http:#a39775058 doesn't make sense to accept.

My suggestion is close as follows:
   http:#a39774106   400 points
   http:#a39774969   50 p.
   http:#a39775075   50 p.

You can do that yourself by again using "Accept Multiple Solutions", which will override the current pending closure.
I feel all left out :-)

You are :P - Qlemo
Avatar of GPSPOW

ASKER

Thanks

It works perfectly now.

Glen