Batch file 用于生成特定年、月、周和的文件夹的批处理脚本;周工作日

Batch file 用于生成特定年、月、周和的文件夹的批处理脚本;周工作日,batch-file,Batch File,最近几天我一直在寻找这个问题的答案。有很多答案涉及全年的批处理文件夹创建,但不够具体,所以我将非常感谢答案 所以我希望有这样的文件夹结构,如下所示 2017 (for example main folder for year 2017) 01_JAN....12_DEC (subfolders with names of month ) 01JAN/01_01_SUN, 02_01_MON, 03_01_TUE...etc (subsub folders with week day n

最近几天我一直在寻找这个问题的答案。有很多答案涉及全年的批处理文件夹创建,但不够具体,所以我将非常感谢答案

所以我希望有这样的文件夹结构,如下所示

2017 (for example main folder for year 2017)  
01_JAN....12_DEC (subfolders with names of month )  
01JAN/01_01_SUN, 02_01_MON, 03_01_TUE...etc  (subsub folders with week day name at the end)
如果可能的话,也可以在这里包括周数,尽管我对周数感到满意

01JAN/01_01_SUN-52, 02_01_MON-01, 03_01_TUE-01...09_01_MON-02 etc with weekdays starts with monday
我计划在条形码生产自动化项目中使用此功能

谢谢大家!
附笔
我得到的最接近的例子是我设法找到的这个例子,它可以通过纯批处理和在下发布的几个日期函数以及其他来源的帮助来实现

  • 此批处理将开始日期转换为修改后的julian日期
  • 通过添加364或闰年365计算结束日期
  • 迭代和之间的所有值,生成文件夹名称
  • 由于
    MD
    将创建中间文件夹,因此只需创建日文件夹
  • 批处理使用ISO日历周,这意味着第一天/最后一天可能属于上一年/下一年的一周-这一不同的年份附加在括号中
在ramdisk上30秒内创建的示例输出:
编辑精简版,调用更少,输出相同需要8秒

> tree a:\
A:\
├───2017
│   ├───01_Jan
│   │   ├───01_01_Sun-52(2016)
│   │   ├───02_01_Mon-01
│   │   ├───03_01_Tue-01
│   │   ├───04_01_Wed-01
...
│   │   ├───30_01_Mon-05
│   │   └───31_01_Tue-05
│   ├───02_Feb
│   │   ├───01_02_Wed-05
│   │   ├───02_02_Thu-05
...
这里是冗长的一批
(将变量Base更改为包含基本文件夹):


PowerShell的答案由于具有内在的日期函数而更加紧凑,
这里没有星期:

$Base = 'D:\Test'
$Year = 2017
$StartDate = Get-Date -Year $Year -Month 1  -Day 1
$EndDate   = Get-Date -Year $Year -Month 12 -Day 31
$DateRange = New-TimeSpan -Start $StartDate -End $EndDate
0..$DateRange.Days|ForEach-Object {
    MD $($Base+$StartDate.AddDays($_).ToString('\\yyyy\\MM_MMM\\dd_MM_ddd'))
}

此批处理文件可执行您想要的操作

编辑:我添加了以下修改: 1-从键盘读取年份,而不是从参数获取。 2-在放置批处理文件的同一文件夹中创建年份文件夹。 3-修复了“第53周”中的一个小错误

@echo off
setlocal EnableDelayedExpansion

set /P "year=Enter desired year: "

rem Select the base folder
cd "%~P0"

rem Initialize all variables
set i=0
for %%a in (Jan:31 Feb:28 Mar:31 Apr:30 May:31 Jun:30 Jul:31 Aug:31 Sep:30 Oct:31 Nov:30 Dec:31) do (
   for /F "tokens=1,2 delims=:" %%m in ("%%a") do (
      set /A i+=1
      set "month[!i!]=%%m"
      set "dpm[!i!]=%%n"
   )
)
set /A "dpm[2]+=^!(year%%4), d=((year+4799)*1461/4-(year+4899)/100*3/4+1)%%7*3, rot=^!d+((d-15)>>31)+1, week=101+51*rot"
if %d% equ 3 set "week=100"
set "dow=SunMonTueWedThuFriSat"
set "dow=!dow:~%d%!!dow:~0,%d%!"

rem Create the folders
md %year%
cd %year%
for /L %%m in (1,1,12) do (
   set "m=0%%m"
   set "m=!m:~-2!"
   md !m!_!month[%%m]!
   cd !m!_!month[%%m]!
   for /L %%d in (1,1,!dpm[%%m]!) do (
      set "d=0%%d"
      if "!dow:~0,3!" equ "Mon" set /A week+=1 & if !week!!rot! equ 1531 set "week=101"
      md !d:~-2!_!m!_!dow:~0,3!-!week:~1!
      set "dow=!dow:~3!!dow:~0,3!"
   )
   cd ..
)

您链接到的答案详细说明了如何解决此问题,以及do和。如果这还不够,请仔细解释原因。我不知道如何计算并将周天数名称(周一、周二、周日等)添加到脚本仅计算的全年批创建文件夹的名称中,例如01_Jan,02_Jan ect没有相应的星期日名称…在第一个示例中,您发布的脚本仅为当前日期(2017年7月23日)生成一个文件夹…我正在寻找一个脚本,该脚本创建全年文件夹,其中日期和月份为整数,日期为星期日(2017年7月1日)第二个例子是在powershell中,我甚至不知道如何使用它:(我刚刚发现了batchscripting:)你应该把Ean主题放到一个新问题中,因为这个问题已经得到了回答,不会引起太多注意。哦,我明白了,谢谢:谢谢你的及时回答它像一个符咒一样工作:)也谢谢你编辑问题:)我设法在我的电脑上启用了powershell并尝试了这个答案,而且,我必须确认它像一个符咒一样工作(只在工作日)再次谢谢你,我很高兴这样做,它节省了很多时间,使工作更容易和更可靠:)我试图让它工作这个批文件你张贴,但似乎我无法执行它…(没有任何提示输入年份或smt)仍然感谢你的时间:)我喜欢你的批+1,在速度方面比我的ftl。但它很少不匹配。也就是说,2004=>20052009=>20102015=>2016等,当第53周进入下一年时。@eshu:代码下面有这样一个指示:“您必须在参数中给出所需的年份”<代码>:/我修改了程序以提示年份…@LotPings:是的,但这是一个很容易修复的小细节。。。看我的edit@LotPings:是,但OP可以随时更改所选答案<代码>;-)
@echo off
setlocal EnableDelayedExpansion

set /P "year=Enter desired year: "

rem Select the base folder
cd "%~P0"

rem Initialize all variables
set i=0
for %%a in (Jan:31 Feb:28 Mar:31 Apr:30 May:31 Jun:30 Jul:31 Aug:31 Sep:30 Oct:31 Nov:30 Dec:31) do (
   for /F "tokens=1,2 delims=:" %%m in ("%%a") do (
      set /A i+=1
      set "month[!i!]=%%m"
      set "dpm[!i!]=%%n"
   )
)
set /A "dpm[2]+=^!(year%%4), d=((year+4799)*1461/4-(year+4899)/100*3/4+1)%%7*3, rot=^!d+((d-15)>>31)+1, week=101+51*rot"
if %d% equ 3 set "week=100"
set "dow=SunMonTueWedThuFriSat"
set "dow=!dow:~%d%!!dow:~0,%d%!"

rem Create the folders
md %year%
cd %year%
for /L %%m in (1,1,12) do (
   set "m=0%%m"
   set "m=!m:~-2!"
   md !m!_!month[%%m]!
   cd !m!_!month[%%m]!
   for /L %%d in (1,1,!dpm[%%m]!) do (
      set "d=0%%d"
      if "!dow:~0,3!" equ "Mon" set /A week+=1 & if !week!!rot! equ 1531 set "week=101"
      md !d:~-2!_!m!_!dow:~0,3!-!week:~1!
      set "dow=!dow:~3!!dow:~0,3!"
   )
   cd ..
)