2013-06-28 2 views
0

Мне нужно выполнить program.exe, которые генерируют мне отчеты для ряда дат, я вызываю program.exe в командной строке, но мне нужно установить два аргумента (текущая дата и текущая_дат-6days), когда я называю его:Windows Командная строка получить дату

c:\program.exe current_date current_date-6 (date before 6 days)

я обнаружил, что эта команда дает мне текущую дату: 28-06-2013 %date:~0,2%-%date:~-7,2%-%date:~-4,4%

, но я не могу получить текущая_дата -6 (означает дату 6 дней до)

я должен также позволить пользователю выбрать диапазон даты он хочет ...

как я могу продолжить выполнение программы 1) автоматически (окна Schedular), дав ему два параметра (текущую дату и дату 6 дней до, например) 2) и вручную в то же время, предоставляя пользователям возможность выбора диапазона дат

@echo off 

set /a currd=%date:~0,2% 
set /a currm=%date:~3,2% 
set /a curry=%date:~6,4% 

set /a d=%date:~0,2% 
set /a m=%date:~3,2% 
set /a y=%date:~6,4% 

FOR %%A IN (1 2 3 4 5 6) DO (
    :loop 
     set /a d-=1 

     if %d% LSS 1 (
     set d=1 
     set /a m-=1 

     if %m% LSS 1 (
      set m=12 
      set /a y-=1 
     ) 
    ) 
    xcopy /d:%m%-%d%-%y% /l . .. >nul 2>&1 || goto loop 
) 

start /WAIT /B "" "C:\MyPGM.exe" "%d%-%m%-%y%" "%currd%-%currm%-%curry%" 

за 28/06/2013 У меня нет проблем, но за 01/07/2013 он генерирует мне ошибку «String was не признан действительным DateTime "

+0

1) этот '% date: ~ 0,2 (-6)%' не работает для меня. Вы имеете в виду '% date: ~ 0,2%'? 2) что вы имеете в виду с 'currend_date-6'? 3) укажите свой формат даты (вывод 'echo% date%'. – Endoro

+0

Почему у вас нет программы, которую вы закодировали, просто принимайте одну дату и вычитаете из нее 'current_date - 6 дней'? сделайте это, чем делать это в пакетном файле. (Если это всегда current_date, пакетный файл даже не должен его передавать, ваш exe может получить его, когда он будет запущен, поэтому командный файл просто должен его запустить). –

+0

Да, что сказал Кен.Если exe всегда начинается с текущей даты, возможно, единственным параметром, который был принят, является ваше смещение (в этом случае 6). Хотите запустить его раз в две недели? Запланируйте планировщик заданий каждые 14 дней вместо ежедневного, и перейдите в 13 вместо 6. – railsdog

ответ

3

Этот скрипт VBS может дать вам дату - 6 и сегодня.

Запустите его, чтобы увидеть справку.

:: Date foward & backward 
@echo off 
if "%~2"=="" (
echo to get todays date use   call "%~n0" today 0 
echo to get yesterdays date use  call "%~n0" today -1 
echo to get 25 days before 19441213 call "%~n0" 1944/12/13 -25 
echo to get 1250 days in the future call "%~n0" today 1250 
echo. 
echo Add a third parameter if you want a separator in the date string 
echo EG: to use - as in YYYY-MM-DD for today's date 
echo  call "%~n0" today 0 - 
echo. 
pause 
goto :EOF) 

set date1=%1 
set qty=%2 
set separator=%~3 
if /i "%date1%" EQU "TODAY" (set date1=now) else (set date1="%date1%") 
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%qty%,%date1%) 
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^&_ 
echo>>"%temp%\%~n0.vbs"   right(100+month(s),2)^&_ 
echo>>"%temp%\%~n0.vbs"   right(100+day(s),2) 
for /f %%a in ('cscript //nologo "%temp%\%~n0.vbs"') do set result=%%a 
del "%temp%\%~n0.vbs" 
endlocal& set day=%result:~0,4%%separator%%result:~4,2%%separator%%result:~6,2% 
echo %%day%% is set to "%day%" (without the quotes) 
pause 
+0

Спасибо за этот ответ, он отлично работает, теперь я пытаюсь установить фиксированные входы (всегда сегодня -1) как я могу изменить его в коде – user1863359

+0

Удалите справку. 'set date1 = today' и' set qty = -1' <- изменить эти строки. измените 'set separator = -', если вы хотите использовать знак минус в качестве разделителя или оставить его пустым. – foxidrive

+0

да, я уже пробовал, но он не работает: сообщение erRor DESPLAYED VERY TIME i RUN THE BATCH FILE/1 В этот раз было неожиданно. – user1863359

0

Вы можете сделать это (операции с датой) очень легко с помощью другого языка. Вот примеры в Perl, Python и Powershell.

@ECHO OFF 
SETLOCAL 

SET PERL_CMD=perl -MPOSIX -e "print(POSIX::strftime(q(%%d-%%m-%%Y),localtime(time()-6*86400)));" 
FOR /F %%d IN ('%PERL_CMD%') DO SET PREV_DATE=%%d 
ECHO %PREV_DATE% 

SET PYTHON_CMD=py -3 -c "from datetime import *; print((datetime.now()+timedelta(days=-6)).strftime('%%d-%%m-%%Y'));" 
FOR /F %%d IN ('%PYTHON_CMD%') DO SET PREV_DATE=%%d 
ECHO %PREV_DATE% 

SET POWERSHELL_CMD=powershell -NoProfile -Command "Get-Date ((Get-Date).AddDays(-6)) -format dd.MM.yyyy" 
FOR /F %%d IN ('%POWERSHELL_CMD%') DO SET PREV_DATE=%%d 
ECHO %PREV_DATE% 

Если вы абсолютно должны сделать это в пакете/CMD, то это может быть (в основном) осуществляется путем разбора строки даты и делать математику на ценности день, месяц и год.

3

Это чисто Пакетное решение, получить количество дней, чтобы вычесть в первом параметре:

@echo off 
setlocal 
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
    set Current_date=%%a-%%b-%%c 
    set /A dd=1%%a-100, mm=1%%b-100, yyyy=%%c 
) 
set /A a=(mm-14)/12, jdn=(1461*(yyyy+4800+a))/4+(367*(mm-2-12*a))/12-(3*((yyyy+4900+a)/100))/4+dd-32075-%1 
set /A l=jdn+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447 
set /A dd=l-(2447*j)/80,l=j/11,mm=j+2-(12*l),yyyy=100*(n-49)+i+l 
if %dd% lss 10 set dd=0%dd% 
if %mm% lss 10 set mm=0%mm% 
set Previous_date=%dd%-%mm%-%yyyy% 
echo Current date:    %Current_date% 
echo Current date minus %1 days: %Previous_date% 

Например:

>test 6 
Current date:    29-06-2013 
Current date minus 6 days: 23-06-2013 

>test 60 
Current date:    29-06-2013 
Current date minus 60 days: 30-04-2013 

>test 600 
Current date:    29-06-2013 
Current date minus 600 days: 07-11-2011 

Ссылка: http://www.hermetic.ch/cal_stud/jdn.htm#comp

+0

Лучший ответ, спасибо – user1863359

+0

@ user1863359: Если бы этот ответ сработал лучше всего для вас, вы должны принять его как правильный ответ. См. [Как принятие ответа работает?] (Http://meta.stackexchange.com/q/5234/172661) или страницы [help] при принятии ответов для получения дополнительной информации. –