2014-11-01 71 views
2

我想創建一個批處理腳本來創建每個日期輸入年份的文件夾,併爲它知道何時進入閏年。我不知道如何創建IF條件,任何人都可以幫助我。謝謝。Windows批處理文件創建文件夾的年份每年進入支持閏年

@ECHO off 
ECHO ### Date Folder Generator: Started! ### 
SET /p year=### Enter Year [e.g. 2014]: 
SET year=%year:,=% 
MKDIR %year% 
CD %year% 
FOR %%G IN (01_January 02_February 03_March 04_April 05_May 06_June 07_July 08_August 09_September 10_October 11_November 12_December) DO MKDIR %%G 
CD 01_January 
FOR /L %%G IN (1,1,31) DO MKDIR %%G-Jan-%year% 
CD .. 
CD 02_February 
FOR /L %%G IN (1,1,28) DO MKDIR %%G-Feb-%year% 
CD .. 
CD 03_March 
FOR /L %%G IN (1,1,31) DO MKDIR %%G-Mar-%year% 
CD .. 
CD 04_April 
FOR /L %%G IN (1,1,30) DO MKDIR %%G-Apr-%year% 
CD .. 
CD 05_May 
FOR /L %%G IN (1,1,31) DO MKDIR %%G-May-%year% 
CD .. 
CD 06_June 
FOR /L %%G IN (1,1,30) DO MKDIR %%G-Jun-%year% 
CD .. 
CD 07_July 
FOR /L %%G IN (1,1,31) DO MKDIR %%G-Jul-%year% 
CD .. 
CD 08_August 
FOR /L %%G IN (1,1,31) DO MKDIR %%G-Aug-%year% 
CD .. 
CD 09_September 
FOR /L %%G IN (1,1,30) DO MKDIR %%G-Sep-%year% 
CD .. 
CD 10_October 
FOR /L %%G IN (1,1,31) DO MKDIR %%G-Oct-%year% 
CD .. 
CD 11_November 
FOR /L %%G IN (1,1,30) DO MKDIR %%G-Nov-%year% 
CD .. 
CD 12_December 
FOR /L %%G IN (1,1,31) DO MKDIR %%G-Dec-%year% 
CD .. 
CD .. 
ECHO ### Leap Years: 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052 2056 2060 2064 2068 2072 2076 2080 2084 2088 2092 2096 2104 2108 2112 2116 2120 2124 2128 2132 2136 2140 2144 2148 2152 2156 2160 2164 2168 2172 2176 2180 2184 2188 2192 2196 2204 2208 2212 2216 2220 2224 2228 2232 2236 2240 2244 2248 2252 2256 2260 2264 2268 2272 2276 2280 2284 2288 2292 2296 2304 2308 2312 2316 2320 2324 2328 2332 2336 2340 2344 2348 2352 2356 2360 2364 2368 2372 2376 2380 2384 2388 2392 2396 2400 
ECHO ### Date Folder Generator: Finished! ### 

如果可以改進FOR循環以獲得某些重複的代碼,那也會很酷。

回答

1
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\years" 
SET /p year=### Enter Year [e.g. 2014]: 
IF NOT DEFINED year GOTO :EOF 
SET year=%year:,=% 
IF %year% lss 100 SET /a year=2000+year 
IF %year% gtr 1901 IF %year% lss 2099 GOTO generate 
ECHO year entered out of range 1901..2099 
GOTO :eof 

:generate 
MD "%sourcedir%" 
SET /a feb=year %% 4 
IF %feb%==0 (SET "feb=02,February,29") ELSE (SET "feb=02,February,28") 
PUSHD "%sourcedir%" 
MKDIR %year% 
CD %year% 
FOR %%a IN ("01,January,31" "%feb%" "03,March,31" "04,April,30" "05,May,31" "06,June,30" "07,July,31" "08,August,31" "09,September,30" "10,October,31" "11,November,30" "12,December,31") DO (
FOR /f "tokens=1-3delims=," %%b IN (%%a) DO (
    SET "month=%%c" 
    SET "month=!month:~0,3!" 
    MKDIR %%b_%%c 
    pushd %%b_%%c 
    FOR /l %%q IN (1,1,%%d) DO MD %%q-!month!-%year% 
    popd 
) 
) 
popd 

GOTO :EOF 

您需要更改sourcedir的設置以適合您的情況。

輸入年處理不是防彈的,但這不是練習的目的。

1
@echo off 
    setlocal enableextensions enabledelayedexpansion 

    rem Input and validate year 
    set /p "year=Enter year (yyyy): " || goto :eof 
    set "year=%year:"=%" & rem " 
    for /f "delims=" %%a in ("%year%") do echo ERROR: Bad data & goto :eof 
    if "%year:~3,1%"=="" echo ERROR: Too short & goto :eof 
    if not "%year:~4%"=="" echo ERROR: Too long & goto :eof 

    for %%f in ( 
     01_January 02_February 03_March 04_April 
     05_May  06_June  07_July  08_August 
     09_September 10_October 11_November 12_December 
    ) do for /f "tokens=1,2 delims=_" %%m in ("%%f") do (

     rem Prepare literals 
     set "monthName=%%n" 
     set "monthShortName=!monthName:~0,3!" 

     rem Calculate days in the month and adjust leap years 
     set /a "month=1%%m %% 100" 
     set /a "days=30+((month+month/8) %% 2)" 
     if %%m==02 set /a "days=days - 2 + (3 - year %% 4)/3 - (99 - year %% 100)/99 + (399 - year %% 400)/399" 

     rem Folders creation 
     for /l %%d in (1 1 !days!) do (
      set "dd=0%%d" 
      md %year%\%%f\!dd:~-2!-!monthShortName!-%year% 2>nul 
     ) 
    ) 

幾點

  • 我已經包括了一個非常基本的一年驗證。
  • 在你問之前,rem "只是爲了得到語法高亮工作,因爲在代碼中有一個奇怪的引用
  • 月份長度不僅計算2月的所有月份。
0

我喜歡Magoo和MC ND的答案 - 它們應該很快。

有一個非常簡單的解決方案,使用getTimestamp.bat - a hybrid JScript/batch utility執行日期算術和格式化操作。它是純粹的腳本,可以在任何Windows機器上運行。完整的文檔嵌入在getTimestamp.bat中。

該解決方案的一個缺點是由於每次迭代啓動Windows腳本宿主(WSH)的開銷都比較慢。

我回應每個創建的文件夾,以便您可以跟蹤進度。

以下我的腳本要求輸入年份作爲%1參數,而不是使用SET/P提示一年。

@echo off 
setlocal enableDelayedExpansion 
for /l %%N in (0 1 365) do (
    call getTimestamp -d "'1/1/%~1'" -od %%N -f "{yyyy}\{mm}_{month}\{dd}-{mth}-{yyyy}" -r dt || exit /b 
    if "!dt:~-4!" neq "%~1" exit /b 
    md "!dt!" 
    echo !dt! 
) 
+0

編輯 - 糟糕,忘記包含getTimestamp鏈接。所有固定。 – dbenham 2014-11-02 21:11:04

0

另一個!

@echo off 
setlocal EnableDelayedExpansion 

rem Input and validate year 
set /P "input=Enter Year [e.g. 2014]: " 
set "year=" 
set /A year=%input:,=%, yearMOD4=year %% 4 2>NUL 
if defined year if !year! geq 2014 if !year! lss 2099 goto continue 
echo Error: Bad data 
goto :EOF 

:continue 
rem Generate arrays with month names and number of days 
set i=100 
for %%a in ([email protected] [email protected] [email protected]  [email protected] [email protected]  [email protected] 
      [email protected] [email protected] [email protected] [email protected] [email protected] [email protected]) do (
    set /A i+=1 
    for /F "tokens=1,2 [email protected]" %%b in ("%%a") do (
     set "month[!i:~-2!]=%%b" 
     set "days[!i:~-2!]=%%c" 
    ) 
) 
if %yearMOD4% equ 0 set days[02]=29 

rem Generate the folders 
md %year% 
cd %year% 
for /F "tokens=2,3 delims=[]=" %%a in ('set month[') do (
    md %%a_%%b 
    for /L %%d in (1,1,!days[%%a]!) do md %%a_%%b\%%d-!month[%%a]:~0,3!-%year% 
)