如何在Windows命令中获取前一个工作日(通过powershell)

时间:2016-10-12 03:42:26

标签: powershell batch-file

我需要在dos批处理文件中获取前一个工作日,因为要处理的文件在yyyymmddddmmmyy格式下的文件名中包含日期。

根据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=%% 

这样做,yyyymmddddmmmyy是今天的日期,而yyyymmddEODddmmmyyEOD就是前一天。

但是,如果我需要获得之前的工作日&#34,我该怎么办?

通过工作日,最好的解决方案可能会是Excel WorkDay functionWORKDAY(start_date, days, [holidays]),但就目前而言,为了简单起见,我们只需要采取周一到星期五为工作日。因此,如果今天是星期二,那么上一个工作日是星期一,而如果今天是星期一,则上一个工作日是上个星期五。

有一个关于如何获得"下一个工作日"的例子。然而,在Powershell Golf: Next business day,它似乎在powershell接口下运行。我试过但没有成功把它变成dos批处理文件。

2 个答案:

答案 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