gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:06:03 35 4
gpt4 key购买 nike

我需要在 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=%%

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

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

通过工作日,最好的解决方案可能是 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

编辑

这是一个更简单的方法。经过一夜的 sleep ,对我来说似乎更明显。 =) 我没有替换我上面写的内容,因为它会使您的评论无效,但我认为它可能仍然有用,所以我添加了它。
@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

关于powershell - 如何在windows命令中获取前一个工作日(通过powershell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39990161/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com