2013-06-28 5 views
0

Je dois exécuter un programme.exe qui me génère des rapports pour une gamme de dates, j'appelle le programme.exe dans une ligne de commande mais je dois définir deux arguments (date actuelle et current_date- 6 jours) quand je l'appelle:Windows Ligne de commande obtenir la date

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

je trouve que cette commande me donne la date actuelle: 28-06-2013 %date:~0,2%-%date:~-7,2%-%date:~-4,4%

mais je ne peux pas obtenir le current_date -6 (signifie la date 6 jours avant)

Je dois aussi laisser l'utilisateur choisir la plage de date où il veut ...

comment je peux procéder à l'exécution du programme 1) automatiquement (fenêtres schedular) en lui donnant les deux paramètres (date actuelle et la date de 6 jours avant par exemple) 2) et manuellement dans le même temps, en donnant aux utilisateurs la possibilité de choisir une plage de dates

@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%" 

pour le 28/06/2013 je n'ai pas de problème mais pour le 01/07/2013 il me génère une erreur "String was non reconnu en tant que DateTime valide "

+0

1) ce '% date: ~ 0,2 (-6)%' ne fonctionne pas pour moi. Voulez-vous dire «% date: ~ 0,2%»? 2) que voulez-vous dire par 'currend_date-6'? 3) s'il vous plaît spécifier votre format de date (la sortie de 'echo% date%'. – Endoro

+0

Pourquoi n'avez-vous pas le programme que vous avez codé simplement accepter une date, et calculer le 'current_date - 6 jours' de cela? faites cela plutôt que de le faire dans un fichier batch (si c'est toujours le current_date, le fichier batch n'a même pas besoin de le passer, votre exe peut l'obtenir quand il est lancé, donc le fichier batch doit juste le démarrer.) –

+0

Ouais, ce que Ken a dit Si l'exe commence toujours avec la date actuelle, peut-être que le seul paramètre passé est votre décalage (6 dans ce cas) .Vous voulez l'exécuter deux fois par semaine? au lieu de tous les jours, et passez dans 13 au lieu de 6. – railsdog

Répondre

3

Ce script VBS a la capacité de vous donner la date - 6 et aujourd'hui.

Lancez-le pour voir l'aide.

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

Merci pour cette réponse cela fonctionne très bien, maintenant j'essaie de mettre une entrée fixe (toujours aujourd'hui -1) comment puis-je le changer dans le code – user1863359

+0

Supprimer l'aide. 'set date1 = today' et' set qty = -1' <- changez ces lignes. changez set separator = -' si vous voulez un signe moins comme séparateur, ou laissez-le vide. – foxidrive

+0

oui je l'ai déjà essayé mais ça ne marche pas: erRor message est DESPLAYED TRES TEMPS je fais tourner le fichier BATCH/1 était inattendu pour le moment. – user1863359

0

Vous pouvez le faire (opérations de date) très facilement avec une autre langue. Voici des exemples dans Perl, Python et 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% 

Si vous absolument devez le faire en batch/CMD, alors il pourrait être (la plupart du temps) accompli par l'analyse d'une chaîne de date et de faire le calcul le jour, le mois, et les valeurs de l'année.

3

Ceci est une solution pure par lots qui obtiennent le nombre de jours pour soustraire au premier paramètre:

@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% 

Par exemple:

>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 

Référence: http://www.hermetic.ch/cal_stud/jdn.htm#comp

+0

meilleure réponse, merci – user1863359

+0

@ user1863359: Si cette réponse a fonctionné mieux pour vous, vous devez l'accepter comme la bonne réponse. Voir [Comment fonctionne l'acceptation d'une réponse?] (Http://meta.stackexchange.com/q/5234/172661) ou les pages [help] sur l'acceptation des réponses pour plus d'informations. –

Questions connexes