我需要在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
有人可以帮忙吗?
答案 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)}
[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