【问题标题】:how to get previous working day in windows command (via powershell)如何在 windows 命令中获取前一个工作日(通过 powershell)
【发布时间】:2016-10-12 03:42:26
【问题描述】:

我需要在 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 是前一天。

但是,如果我需要获得前一个“工作日”,我该怎么办?

工作日,最好的解决方案可能是Excel WorkDay functionWORKDAY(start_date, days, [holidays]),但现在,为了简单起见,我们只将星期一到星期五作为工作日。所以如果今天是星期二,那么上一个工作日就是星期一,而如果今天是星期一,那么上一个工作日就是上一个星期五。

Powershell Golf: Next business day 有一个关于如何获取“下一个工作日”的示例,但是,它似乎在 powershell 界面下运行。我试过但没有成功把它变成一个dos批处理文件。

【问题讨论】:

  • “工作日”在您的问题中没有精确定义,可能取决于特定于您客户需求的许多因素。
  • 我会尝试运行另一个 powershell 命令来使用this anwers 获取工作日的编号,如果结果证明“昨天”是星期天,则运行用于获取的命令昨天的日期不是addDays(-1),而是addDays(-3),以获得星期五的日期。如果您只想拥有工作日,如果昨天是周六或周日,您可以返回 Friday
  • @geisterfurz007 如何将powershell和dos命令结合在一起?
  • 在上面的代码中你是如何做到的。您应该像以前一样将 powershell 命令的结果放入一个变量中,然后使用该变量生成下一个命令,您应该从中获得所需的输出。

标签: powershell batch-file


【解决方案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

【讨论】:

    【解决方案2】:

    我编的一个小脚本应该是这样的:

     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
    

    这将回显昨天的工作日,或者如果昨天是周六或周日,它将回显“星期五”

    编辑: 出于对自己的好奇,我写了一个版本,如果需要的话,会给出日期:

    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

    可能更容易做,但永远不要接触正在运行的系统;)

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多