我需要在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
就是前一天。
但是,如果我需要获得之前的工作日&#34,我该怎么办?
通过工作日,最好的解决方案可能会是Excel WorkDay function,WORKDAY(start_date, days, [holidays])
,但就目前而言,为了简单起见,我们只需要采取周一到星期五为工作日。因此,如果今天是星期二,那么上一个工作日是星期一,而如果今天是星期一,则上一个工作日是上个星期五。
有一个关于如何获得"下一个工作日"的例子。然而,在Powershell Golf: Next business day,它似乎在powershell接口下运行。我试过但没有成功把它变成dos批处理文件。
答案 0 :(得分:1)
我编写的一个小脚本看起来像这样:
for /f "usebackq" %%i in (`PowerShell $date ^= Get-Date^; $date.AddDays^(-1^)^; $date.getWeekDay^(^)^;`) DO (
SET weekday=%%i
Goto outer
)
:outer
set weekday=%weekday:,=%
"set weekend="
if "x%weekday%"=="xSunday" set weekend=1
if "x%weekday%"=="xSaturday" set weekend=1
if defined weekend (
echo Friday
) Else (
echo %weekday%
)
pause
这将与昨天的工作日相呼应,或者如果昨天是星期六或星期日,它将回应"星期五"
编辑: Beeing对自己很好奇我写了一个版本,如果需要的话会给出日期:
for /f "usebackq" %%i in (`PowerShell $date ^= Get-Date^; $date.AddDays^(-1^)^; $date.getWeekDay^(^)^;`) DO (
SET weekday=%%i
Goto:outer
)
:outer
set weekday=%weekday:,=%
if "x%weekday%"=="xSaturday" (
for /f "usebackq" %%i in (`PowerShell $date ^= Get-Date^; $date.AddDays^(-2^)^; $date.toString^('yyyyMMdd'^)^;`) DO (
SET weekday=%%i
)
Goto:echoWD
) Else (
if "x%weekday%"=="xSunday" (
for /f "usebackq" %%i in (`PowerShell $date ^= Get-Date^; $date.AddDays^(-3^)^; $date.toString^('yyyyMMdd'^)^;`) DO (
SET weekday=%%i
)
Goto:echoWD
) Else (
for /f "usebackq" %%i in (`PowerShell $date ^= Get-Date^; $date.AddDays^(-1^)^; $date.ToString^('yyyyMMdd'^)^;`) DO (
SET weekday=%%i
)
Goto:echoWD
)
)
:echoWD
echo %weekday%
pause
注意:输出将采用您的语言,因此您可能需要在德国将xSunday
更改为xSonntag
。
可能更容易,但从不接触正在运行的系统;)
答案 1 :(得分:1)
这可能更具可读性。您可以根据需要进行调整。不需要转义字符。
@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