PowerShell如何列出一段日期范围内的所有日期。

9

我正在使用PowerShell编写脚本,需要知道一段时间内的日期。

这个脚本用于自动化报告。假设有一堆已记录的数据,但是只在工作日收集数据,周末和节假日不收集。我通过FTP收集最近15代的记录。

使用脚本打开最新的Excel报告。一旦工作簿打开,我读取一个包含日期的单元格,该日期将确定报告上次运行的时间。(今天的数据直到明天才能访问,因此始终落后1天。)

然后,我使用Get-Date获取当前日期。我需要知道当前日期和从Excel中读取的日期之间的日期。之后,我需要查看这些日期是否落在节假日或周末。

$excelDate = $excel.Cells.Item(1489, 1).Value()
$currentDate = Get-Date 

假设有 $excelDate = "03/07/2014"$currentDate = "03/14/2014",我想获取的是 03/08/2014、03/09/2014、03/10/2014、03/11/2014、03/12/2014 和 03/13/2014 这些日期。一旦获得这些日期,我就可以检查它们是否是节假日,如果它们是在周末,则进行相应的操作。如果它们是在假期,则减去1天(如果报告的最后一天是星期五,则减去2天),并使用 switch 来获取正确数据的内容,然后开始解析并将其放入 Excel 中。
switch($daysMissed)    
        {                                                       
           1  {Write-Host "The Report is currently up to date!!"                       }   
           2  {$data = get-content C:\Users\$userName\Desktop\Report\data\data.txt  }  
           3  {$data = get-content C:\Users\$userName\Desktop\Report\data\data2.txt } 
           4  {$data = get-content C:\Users\$userName\Desktop\Report\data\data3.txt }
           5  {$data = get-content C:\Users\$userName\Desktop\Report\data\data4.txt }
           6  {$data = get-content C:\Users\$userName\Desktop\Report\data\data5.txt }
           7  {$data = get-content C:\Users\$userName\Desktop\Report\data\data6.txt } 
           8  {$data = get-content C:\Users\$userName\Desktop\Report\data\data7.txt } 
           9  {$data = get-content C:\Users\$userName\Desktop\Report\data\data8.txt } 
           10 {$data = get-content C:\Users\$userName\Desktop\Report\data\data9.txt }
           11 {$data = get-content C:\Users\$userName\Desktop\Report\data\data10.txt }
}

一旦我有了正确的数据,我就会在 Excel 中进行一系列操作并完成当天的报告,然后我会执行 $daysMissed = $daysMissed - 1

那么我的问题是,如何列出一段日期范围内的日期?

或者,有没有更简单的方法来做我正在做的事情?

感谢您的帮助!

6个回答

13

可能是这样的:

$excelDate = get-date "03/07/2014"
$currentDate = get-date "03/14/2014"

for ( $i = $excelDate.AddDays(1); $i -lt $currentDate; $i=$i.AddDays(1) )  { 
    $i.ToShortDateString()
}

我复制了一个稍旧的...我会编辑以修复...我忘记了应该是 $i=$i.AddDays(1) - Hunter Eidson

4

这个?

PS C:\ps> [datetime]$a =  "03/07/2014"
PS C:\ps> [datetime]$b =  "03/14/2014"
PS C:\ps> 1..(($b -$a).days-1) | % {$a.AddDays($_)}

sabato 8 marzo 2014 00:00:00
domenica 9 marzo 2014 00:00:00
lunedì 10 marzo 2014 00:00:00
martedì 11 marzo 2014 00:00:00
mercoledì 12 marzo 2014 00:00:00
giovedì 13 marzo 2014 00:00:00

或者

PS C:\ps> 1..(($b -$a).days-1) | % {$a.AddDays($_).ToShortDateString()}
08/03/2014
09/03/2014
10/03/2014
11/03/2014
12/03/2014
13/03/2014

3

像这样的东西,也许是吗?

(注:保留原html标签)
$excelDate = "03/07/2014" 
$currentDate = "03/14/2014"

$start = [Datetime]$excelDate
$end   = [Datetime]$currentDate

While ($start -lt $end)
 {
  $start = $start.AddDays(1)
  $start.ToShortDateString()
 }

3/8/2014
3/9/2014
3/10/2014
3/11/2014
3/12/2014
3/13/2014
3/14/2014

这是我最初的想法 :) - user189198

1

这是另一个向文件写入内容的示例。您应该将 $path 变量调整为适合您需求的内容。

function GenerateDates($beginDate,$EndDate)
{
      $path="c:\temp\data.csv"
      "day,week" | Out-File -Append -LiteralPath $path


      $date=$beginDate
      $week=$beginDate
    Do{
         for($i=1;$i -lt 7;$i++)
         {
             $d1=$date.ToString("yyyy-MM-dd")
             $d2=$week.ToString("yyyy-MM-dd")
             "$d1,$d2" | Out-File  -Append -LiteralPath $path
             $date=$date.AddDays(1)
         }
         $date=$date.AddDays(1)
         $week=$date

    }Until($date -gt $endDate)   

}

$beginDate=[datetime]::Parse("2017-09-10")  
$endDate=[datetime]::Parse("2018-06-10")
GenerateDates $beginDate $endDate

0

对于那些喜欢简洁和一行代码的人,这里有一个快速/紧凑的解决方案:

$calendar = ({ param([datetime]$from, [datetime]$to, [int]$i=0) do { $from=$from.AddDays($i++);$from } while ($from -le $to) }).Invoke('2021-01-01', (Get-Date))

...对于任何想要将此代码分解的人,这里是相同的代码,但拆成了多行:

$calendar = {
    param(
        [datetime]$from
      , [datetime]$to
      , [int]     $i=0
    )
    do {
        $from = $from.AddDays($i++)
        $from
    } while ($from -le $to)
}.Invoke('2021-01-01', (Get-Date))

...最后再加上一些注释

$calendar = {                       # assign the results of the rest of the code to $calendar
                                    # & begin an anonymous script block, which we can invoke
    param(                          # begin param declaration
        [datetime]$from             # declare the from datetime param
      , [datetime]$to               # declare the to datetime param
      , [int]     $i=0              # declare the counter/offset for our do-loop, which we
                                    # have a default as 0, which is a shortcut way of declaring
                                    # the variable instead of inside the script block
    )                               # end param declaration
    do {                            # begin the do-while loop
        $from = $from.AddDays($i++) # increment the start date by one day
        $from                       # return this date to the receiving variable
    } while ($from -le $to)         # repeat the do-while if from <= to
}.Invoke('2021-01-01', (Get-Date))  # finally, we invoke the anonymous function and pass in
                                    # our start and end dates

0

我注意到这些片段中很少有包含开始日期的输出。只需记得在输出后调用.AddDays(),并将-lt更改为-le(小于变为小于等于)。

我知道这不是最初提出的问题,但我有一个类似的问题,希望这可以帮助其他遇到类似问题的人(打印给定范围内的所有日期)。

Function Build-Calendar() {

    Param (

        [System.DateTime] $PeriodStart,
        [System.DateTime] $PeriodEnd

    )

    while ($PeriodStart -le $PeriodEnd) {
        
        $PeriodStart.ToShortDateString()
        $PeriodStart = $PeriodStart.AddDays(1)

    }
}

$testParameters = @{
    
    PeriodStart = "09/16/2020"
    PeriodEnd = "09/30/2020"

}

Build-Calendar @testParameters

9/16/2020
9/17/2020
9/18/2020
9/19/2020
9/20/2020
9/21/2020
9/22/2020
9/23/2020
9/24/2020
9/25/2020
9/26/2020
9/27/2020
9/28/2020
9/29/2020
9/30/2020

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接