批处理文件 - 在每个工作日创建文件夹(没有星期六和星期日)

Posted

技术标签:

【中文标题】批处理文件 - 在每个工作日创建文件夹(没有星期六和星期日)【英文标题】:BATCH FILE - create folders with every WORKING DAY (no saturday and sunday) 【发布时间】:2022-01-11 15:51:19 【问题描述】:

我想编辑以下批处理代码,以便在一年中的每个工作日创建一个文件夹并跳过星期六和星期日(我想它应该连续创建 5 天并跳过接下来的 2 天) 我也希望批处理文件

    跳过为每个月创建文件夹(一月文件夹、二月文件夹等),并将一年中的所有日子都放在同一个文件夹中。 在每天的文件夹中添加两个额外的文件夹,分别是“早上”和“下午”

例如:

C:\Users\alex\Desktop\2022\1 Jan\Morning
C:\Users\alex\Desktop\2022\1 Jan\Afternoon

一直到

C:\Users\alex\Desktop\2022\31 Dec\Morning
C:\Users\alex\Desktop\2022\31 Dec\Afternoon

(它不会创建 31 dec 文件夹,因为那是星期六)

@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

【问题讨论】:

银行/公共假期怎么样,通常也不是“工作日”。如果您只对工作日感兴趣,即一周中不包括周末的日子,那么最好这样说,而不会增加使用“工作”一词的混淆。顺便说一句,我强烈建议您不要考虑仅使用批处理文件执行此任务,请获得 PowerShell 或其他支持日期对象的实用程序的帮助。 如果您想要一个纯粹的batch-file 解决方案,Ritchie Lawrence 的许多脚本都可以满足您的需求。您需要的大部分代码都在这个Q&A 中。他用数字 1 到 7 设置星期几。但不确定 1 是代表星期日还是星期一。 【参考方案1】:

不是纯批处理,但您可以使用powershell 提供帮助。

@echo off
set "sourcedir=U:\years"
set /p year=### Enter Year [e.g. 2014]:
echo 0..365 ^| %%  $date = Get-Date "%year%-01-01";$date = $date.AddDays($_).ToString("dddd dd MMMM yyyy");Write-Host $date"" >tmp.ps1
for /F "tokens=1-4*" %%a in ('powershell .\tmp.ps1') do (
    if "%%~d" == "2022" if not "%%a" == "Saturday" if not "%%a" == "Sunday" (
        echo mkdir "%sourcedir%\%%c %%d\%%a %%b\Morning"
        echo mkdir "%sourcedir%\%%c %%d\%%a %%b\Afternoon"
  )
)
del /Q tmp.ps1

PS!!您根本不必使用临时文件,我现在只是没有时间对特殊字符进行所有转义,但如果您可以使用混合,它将帮助您朝着正确的方向前进。

您可以随意移动年/月/日。如果您想要较短的月份和日期(十二月、星期一而不是十二月的星期一),请更改 powershell 部分中的格式:

echo 0..365 ^| %%  $date = Get-Date "%year%-01-01";$date = $date.AddDays($_).ToString("ddd dd MMM yyyy");Write-Host $date"" >tmp.ps1

结果:

【讨论】:

【参考方案2】:

当您使用正确的方法和公式时,这是一项非常简单的任务:

@echo off
setlocal EnableDelayedExpansion

set "i=0"
for %%a in (Mon Tue Wed Thu Fri Sat Sun) do (
   set "DayOfWeek[!i!]=%%a"
   set /A i+=1
)

set /P "Year=Enter year: "
set /A "leap=28+^!(Year%%4)*^!^!(Year%%400)"
set "MonthNameDays=Jan:31 Feb:%leap% Mar:31 Apr:30 May:31 Jun:30 Jul:31 Aug:31 Sep:30 Oct:31 Nov:30 Dec:31"

rem Get Julian Day Number of Jan/01 of given year
rem adjusted as multiple of day of week: JDN % 7 = 0..6 for Mon..Sun
rem Reference: http://www.hermetic.ch/cal_stud/jdn.htm#comp

set /A "JDN=(1461*(Year+4799))/4+4037/12-(3*((Year+4899)/100))/4-1, MM=100"

for %%a in (%MonthNameDays%) do for /F "tokens=1,2 delims=:" %%x in ("%%a") do (
   set /A MM+=1
   ECHO md "!MM:~1! %%x"
   ECHO pushd "!MM:~1! %%x"
   for /L %%d in (1,1,%%y) do (
      set /A "JDN+=1, DOW=JDN%%7, DD=100+%%d"
      if !DOW! lss 5 (
         for %%w in (!DOW!) do (
            ECHO md "!DD:~-2! !DayOfWeek[%%w]!"
         )
      )
   )
   ECHO popd
)

我专注于为每周的周一至周五生成文件夹的核心点,所以我没有包含一些小细节,例如生成早上/下午文件夹。另外,我只是回应了“MD”命令...

【讨论】:

【参考方案3】:

根据我之前的评论,以下批处理文件得到了 PowerShell 的帮助:

@Echo Off
SetLocal EnableExtensions

:AskYear
ClS
Set "YYYY="
Set /P "YYYY=Please enter a four digit year from 1900 to 2099 incl.>"
Set YYYY 2>NUL|%SystemRoot%\System32\findstr.exe /R^
 "^YYYY=19[0123456789][0123456789]$ ^YYYY=20[0123456789][0123456789]$" 1>NUL || GoTo AskYear
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile^
 "$beginningOfYear = Get-Date -Year %YYYY% -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0;"^
 "$endOfYear = ($beginningOfYear).AddYears(1).AddSeconds(-1);"^
 "While ($beginningOfYear -LE $endOfYear) "^
 " $beginningOfYear = ($beginningOfYear).AddDays(1);"^
 " If ($beginningOfYear.DayOfWeek -GT 0) "^
 "  If ($beginningOfYear.DayOfWeek -LT 6) "^
 "   $children=@('Morning','Afternoon');"^
 "   ForEach ($i In $children) "^
 "    md \"$($beginningOfYear.ToString('yyyy\\d MMM'))\$i\""

以上示例假定您的文化/区域设置使用一周的第一天 0 作为周末的最后一天,并将 6 作为周末的第一天。如果您的文化/区域设置分别在这两天使用 65,那么您只需相应地更改代码:

@Echo Off
SetLocal EnableExtensions

:AskYear
ClS
Set "YYYY="
Set /P "YYYY=Please enter a four digit year from 1900 to 2099 incl.>"
Set YYYY 2>NUL|%SystemRoot%\System32\findstr.exe /R^
 "^YYYY=19[0123456789][0123456789]$ ^YYYY=20[0123456789][0123456789]$" 1>NUL || GoTo AskYear
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile^
 "$beginningOfYear = Get-Date -Year %YYYY% -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0;"^
 "$endOfYear = ($beginningOfYear).AddYears(1).AddSeconds(-1);"^
 "While ($beginningOfYear -LE $endOfYear) "^
 " $beginningOfYear = ($beginningOfYear).AddDays(1);"^
 " If ($beginningOfYear.DayOfWeek -LT 5) "^
 "  $children=@('Morning','Afternoon');"^
 "  ForEach ($i In $children) "^
 "   md \"$($beginningOfYear.ToString('yyyy\\d MMM'))\$i\""

【讨论】:

以上是关于批处理文件 - 在每个工作日创建文件夹(没有星期六和星期日)的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本实现每个工作日定时执行指定程序

安排Cron跳过每个月的第一个星期六

MS Access VBA 嵌套循环错误处理。我需要在每个嵌套循环中进行不同的错误处理。它是如何工作的?

如何查找上周日的日期并将其保存在Windows批处理文件的变量中

每个星期六安排一个cron工作,间隔为21天

Pentaho 作业未通过运行批处理文件执行