我需要在dos批处理文件中获取前一个工作日,因为要处理的文件在文件名中具有日期,在yyyymmdd和ddmmmyy格式下.
根据Dos to get next day date,似乎这在纯dos命令中相当复杂.
所以我转而在dos中调用powershell.到目前为止,我到达这里:
FOR /f "usebackq" %%i IN (`PowerShell $date ^= Get-Date^; $date.ToString^('yyyyMMdd'^)`) DO SET yyyymmdd=%%i
FOR /f "usebackq" %%i IN (`PowerShell $date ^= Get-Date^; $date.ToString^('ddMMMyy'^)`) DO SET ddmmmyy=%%
FOR /f "usebackq" %%i IN (`PowerShell $date ^= Get-Date^; $date^=$date.AddDays^(-1^)^; $date.ToString^('yyyyMMdd'^)`) DO SET yyyymmddEOD=%%i
FOR /f "usebackq" %%i IN (`PowerShell $date ^= Get-Date^; $date^=$date.AddDays^(-1^)^; $date.ToString^('ddMMMyy'^)`) DO SET ddmmmyyEOD=%%
通过这样做,yyyymmdd和ddmmmyy是今天的日期,而yyyymmddEOD和ddmmmyyEOD是前一天.
但是,如果我需要获得之前的“工作日”,我该怎么办?
到了工作日,最好的解决方案可能是Excel WorkDay function,WORKDAY(start_date,days,[holidays]),但就目前来说,为了简单起见,我们只需要将周一到周五作为工作日.因此,如果今天是星期二,那么前一个工作日是星期一,而如果今天是星期一,那么前一个工作日是星期五.
有一个关于如何在Powershell Golf: Next business day获得“下一个工作日”的例子,但它似乎在powershell界面下运行.我试过但没有成功把它变成dos批处理文件.
最佳答案 这可能更具可读性.您可以根据需要进行调整.不需要转义字符.
@echo off & setlocal enabledelayedexpansion
set days=-0 -1 -3
set formats=yyyyMMdd ddMMMyy
set ps=[DateTime]::Now.AddDays(%%b).ToString('%%a')
REM Get today, yesterday, and three days ago in two date formats
for %%a in (%formats%) do (
for %%b in (%days%) do (
for /f %%p in ('"powershell %ps%"') do set date-%%a%%b=%%p
)
)
REM If today is Monday, subtract 3 for EOD, else subtract 1
for /f %%a in ('"powershell [DateTime]::Now.ToString('ddd')"') do (
if "%%a"=="Mon" (set sub=3) else (set sub=1)
)
REM Change the variable names if you want
set yyyymmdd=%date-yyyymmdd-0%
set ddmmmyy=%date-ddmmmyy-0%
set yyyymmddEOD=!date-yyyymmdd-%sub%!
set ddmmmyyEOD=!date-ddmmmyy-%sub%!
REM Output your variables
set yyyymmdd
set ddmmmyy
输出(今天,周三,10月12日):
yyyymmdd=20161012
yyyymmddEOD=20161011
ddmmmyy=12Oct16
ddmmmyyEOD=11Oct16
编辑
这是一种更简单的方法.经过一夜的睡眠,这对我来说似乎更加明显. =)我没有替换上面写的内容,因为它会使你的评论无效,但我认为它可能仍然有用,所以我添加了它.
@echo off
REM If today is Monday, subtract 3 for EOD, else subtract 1
if %date:~0,3%==Mon (set EOD=-3) else (set EOD=-1)
REM Get today and last EOB in two date formats
for %%a in (yyyyMMdd ddMMMyy) do (
for /f %%p in ('"powershell [DateTime]::Now.ToString('%%a')"') do set %%a=%%p
for /f %%p in ('"powershell [DateTime]::Now.AddDays(%EOD%).ToString('%%a')"') do set %%aEOD=%%p
)
REM Output your variables
set yyyymmdd
set ddmmmyy