2017-09-14 23 views
0

日期我有一個要求,以創建一個文件夾,在PowerShell代碼或批處理腳本爲了得到前一個月的最後一個工作日,當我們給今天在PowerShell中

例如前一個月的最後一個工作日 - 如果我運行一個批處理今天的日期2017年9月14日,則文件夾應該創建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

這裏呈現爲可重複使用的功能,可能的解決方案:

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

謝謝馬克!它的工作 – Irfan

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 
+0

感謝you..this還曾! – Irfan

+0

@Mathias有沒有很好的理由使用'[System.DayOfWeek] :: Saturday,[System.DayOfWeek] :: Sunday'而僅僅是星期六和星期天作爲字符串?前者可能處理語言/語言環境變體,因爲字符串版本沒有?或者一般來說更加明確? –

+1

@MarkWragg在這種特殊情況下,沒有功能差異,但我喜歡在發佈示例時明確表示,而不是讓人們認爲「星期天」是某種神奇的字符串:-)還有一個好處,即[Enum] :: ValueName -eq $ something'將始終工作,不管$ something是字符串(「Sunday」),值類型('0')還是枚舉('[DayOfWeek] :: Sunday')表示的左邊手邊值 –

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 
相關問題