【问题标题】:Powershell list the dates between a range of dates.Powershell 列出一系列日期之间的日期。
【发布时间】:2014-04-19 20:28:17
【问题描述】:

我正在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 天......我仍在试图弄清楚我将如何做到这一点。),并且在我开始解析并将其放入Excel 之前,使用正确数据的switchget-content

所以是这样的:

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

所以我的问题是我将如何准确列出日期范围之间的日期?

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

感谢您的帮助!

【问题讨论】:

    标签: excel date powershell


    【解决方案1】:

    可能是这样的:

    $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)
    【解决方案2】:

    对于所有喜欢简洁和单行的人来说,这里有一个快速/紧凑的解决方案:

    $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))
    

    ...最后还有几个 cmets

    $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
    

    【讨论】:

      【解决方案3】:

      我注意到这些 sn-ps 中很少有实际在输出中包含开始日期。只要记住在输出之后调用 .AddDays() ,并将 -lt 更改为 -le(小于等于)。

      我明白这不是最初提出的问题,但我有一个与 OP 类似的问题,希望这能帮助其他有类似问题的人(打印给定范围内的所有日期)。

      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
      

      【讨论】:

        【解决方案4】:

        这是另一个写入文件的示例。您应该将 $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
        

        【讨论】:

          【解决方案5】:

          这个?

          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
          

          【讨论】:

            【解决方案6】:

            可能是这样的吧?

            $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
            

            【讨论】:

            • 这就是我第一次想到这样做的方式:)
            猜你喜欢
            • 2010-09-21
            • 2021-08-15
            • 2021-12-19
            • 1970-01-01
            • 2018-04-30
            • 2023-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多