2011-08-15 28 views
3

我需要編寫一個調用命令並傳遞前一天日期參數的批處理文件。批處理文件中的前一天變量

實施例:

[功能] CCYYMMDD

我似乎不能找到的這個任何例子。而且我的公司不喜歡我們使用免費軟件,所以我真的需要解決方案成爲純粹的基於DOS的解決方案。

+0

我偶然發現了一些基於批處理的糟糕情況(它是在Win32上轉動Apache日誌文件的腳本,如果你想自己做一些Google搜索) - 我會看看是否可以挖出來您。它是什麼Win版本?我似乎記得我不得不修改它以使其在2K3上工作... – DaveRandom

+0

我剛剛記得爲什麼我必須修改它,這是因爲'date'命令根據系統本地化設置以不同格式輸出日期 - 這是一臺機器還是許多可能具有不同設置的機器? – DaveRandom

+0

Windows Server 2008 R2 –

回答

2

您可以從Dostips: Date and Time
開始有功能來評估日期以連續日計數,反之亦然。
所以它的結果

call :jdate "%date%" JD_result 
set /a prev_day=JD_result-1 
call :jdate2date %prev_day% YYYY MM DD 
echo Previous day is %DD%.%MM%.%YYYY% 
+0

我收到以下錯誤:系統找不到指定的批處理標籤 - jdate –

+0

將dostips中的函數複製到批處理文件中可能是個好主意 – jeb

0

我無法找到原來的解決方案,我有這個,但我發現something over at Rob Van Der Woude's site,將做的工作很好。

由於SET /A將字符串以0開頭的字符串視爲八進制,因此在該日誌文件中存在一個錯誤,並且這會在日/月日期以零開始時導致問題。

如果得到上面鏈接中的文件,但對更改代碼:JDate程序(線157)到:

SET MonthChecker1=%2 
SET MonthChecker2=%MonthChecker1:~0,1% 
IF %MonthChecker2%==0 (
    SET MonthChecker3=%MonthChecker1:~1,1% 
) ELSE (
    SET MonthChecker3=%MonthChecker1% 
) 
SET DayChecker1=%3 
SET DayChecker2=%DayChecker1:~0,1% 
IF %DayChecker2%==0 (
    SET DayChecker3=%DayChecker1:~1,1% 
) ELSE (
    SET DayChecker3=%DayChecker1% 
) 
SET /A Month1 = (%MonthChecker3% - 14)/12 
SET /A Year1 = %1 + 4800 
SET /A JDate = 1461 * (%Year1% + %Month1%)/4 + 367 * (%MonthChecker3% - 2 -12 * %Month1%)/12 - (3 * ((%Year1% + %Month1% + 100)/100))/4 + %DayChecker1% - 32075 
FOR %%A IN (Month1 Year1) DO SET %%A= 
GOTO:EOF 

這是測試,並在2K8R2箱的工作。絕對值得使用它,而不是其他解決方案,因爲它有能力確定主機系統上的日期格式來自注冊表,而我找不到其他解決方案。

+0

要解決八進制問題,您還可以使用'set/a Month = 1%月%%% 100',它始終以'1'作爲前綴號,模以一種安全的方式去除它 – jeb