Windows批处理文件为年份中的每个日期创建文件夹,支持闰年

时间:2014-11-01 21:01:44

标签: batch-file

我正在尝试制作一个批处理脚本,为输入的年份的每个日期创建文件夹,并让它知道何时输入闰年。我不知道如何创建IF条件所以任何人都可以帮助我。感谢。

@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循环以避免某些代码重复,那么也会很酷。

4 个答案:

答案 0 :(得分: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 :(得分: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=0123456789" %%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执行日期算术和格式化操作有一个非常简单的解决方案。它是纯脚本,可​​以在XP前面的任何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!
)

答案 3 :(得分: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 (January@31 February@28 March@31     April@30   May@31      June@30
            July@31    August@31   September@30 October@31 November@30 December@31) do (
   set /A i+=1
   for /F "tokens=1,2 delims=@" %%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%
)