我们在Powershell中提供今天的日期,以获得上个月的最后一个工作日

时间:2017-09-14 11:53:37

标签: powershell date batch-file

我需要在powershell代码或批处理脚本中使用上个月的最后一个工作日创建一个文件夹

例如 - 如果我今天运行的批次为09/14/2017,那么该文件夹应该创建一个日期为08312017

这是我的代码段

filename.ps1

$MonthEndDate= ((get-date -day 1).adddays(-1)).ToShortDateString()

Monthenddate.bat

@echo on

FOR /F %%i IN ('powershell "%~dp0filename.ps1" //Nologo') do SET MYDATE=%%i
echo %MYDATE%

 MKDIR %MYDATE%

 :END

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

这是一个可重用函数的可能解决方案:

Function Get-LastWorkingDayPrevMonth ($Date = (Get-Date)) {
    (-1..-7 | ForEach-Object { (Get-Date $Date -day 1).AddDays($_) } | Where-Object DayOfWeek -notin 'Saturday','Sunday') | Select -First 1
}

#Uses current date by default to return the last working day of the previous month
(Get-LastWorkingDayPrevMonth).ToString('ddMMyyyy')

#Based on specific date
(Get-LastWorkingDayPrevMonth 05/2017).ToString('ddMMyyyy')

该功能的工作原理是获取任何月份过去7天的日期,过滤掉周六或周日的任何日期,然后选择该列表中的第一个日期(这将是最新的日期)。然后,它在结果Date对象上使用ToString方法将其转换为您想要的字符串格式。

答案 1 :(得分:0)

使用do{}while()循环减去一天,直到星期六或星期日DateTime变量

# Define non-workdays
$weekend = [System.DayOfWeek]::Saturday,[System.DayOfWeek]::Sunday

# Get first day of current month
$date = Get-Date -Day 1
do{
    # Subtract one day
    $date = $date.AddDays(-1)
} while($weekend -contains $date.DayOfWeek) # until a weekday is reached

答案 2 :(得分:0)

由于PowerShell编码中总有另一种替代方法:

$LWDPM = (Get-Date -Day 1).AddDays(-1)
While (!([int]$LWDPM.DayOfWeek % 6)){$LWDPM=$LWDPM.AddDays(-1)}
  • 当然LWDPM表示LastWorkingDayPreviousMonth ;-)
  • 公式[int]$LWDPM.DayOfWeek % 6在星期日= 0和星期六= 6
  • 时返回零
  • !否定了这一点,所以周末.AddDays(-1)

批量包装:

:: Q:\Test\2017\09\14\SO_46218430.cmd
@Echo off
For /f %%A in (
  'powershell -NoP -C "$DT=(Get-Date -Day 1).AddDays(-1);While (!([int]$DT.DayOfWeek %% 6)){$DT=$DT.AddDays(-1)};$DT.ToString(\"MMddyyyy\")"'
) do Set MyDate=%%A
Echo MyDate=%MyDate%

示例输出:

> SO_46218430.cmd
MyDate=08312017