【问题标题】:compare dates and assign to each variable比较日期并分配给每个变量
【发布时间】:2019-11-23 11:54:27
【问题描述】:

我在目录中有 2 个带有时间戳 (YYYYMMdd_HHmmss) 的 excel 文件,如下所示。 目录中有2个excel文件。我将从目录中的文件名中提取时间戳,然后比较两个日期,最后为每个日期分配变量。

我想将$Start 变量赋值为report-capacity-server01.contoso.com-20191010_171044.xlsx.

我想将$End 变量赋值为report-capacity-server01.contoso.com-20191108_130454.xlsx.

【问题讨论】:

  • 你的问题是什么?你想知道如何获取时间戳吗?
  • 首先目录下有2个excel文件。我将从目录中的文件名中提取时间戳,然后比较两个日期,最后为每个日期分配变量。
  • 在这种情况下,请使用此说明编辑您的问题以进行澄清。
  • 我有点不清楚目录中的文件的名称是什么。这些名称只是像20191010_171044.xlsx 这样的时间戳还是名称的时间戳部分?能举个例子吗?
  • 没有名称,只是时间戳,例如 20191010_171044.xlsx。例如 report-capacity-server01.contoso.com-20191108_130454.xlsx 像这样。我将从文件名中提取时间戳

标签: powershell compare


【解决方案1】:

如果您希望完整文件名按嵌入时间戳(可能带有不同的名称前缀)按时间顺序排序,请传递时间戳提取表达式作为排序标准。

$Start, $End = (Get-ChildItem *.xlsx |
                 Sort-Object { ($_.Name -split '[-.]')[-2] }).FullName
  • Get-ChildItem *.xlsx 获取当前目录中所有扩展名为 .xlsx 的文件的文件信息对象([System.IO.FileInfo] 实例)。

  • Sort-Object 接收一个脚本块 ({ ... }) 作为标准,通过将每个输入文件的名称 ($_.Name) 拆分为 -. 字符并提取第二个到-last ([-2]) 结果令牌。

  • (...).FullName 使用member-access enumeration 提取已排序文件信息对象的全名(路径)。

  • $Start, $End = ... 是一个解构赋值,它将 2 个(按时间排序的)完整文件名分配给各个变量。请注意,如果有超过 2 个文件,$End 将接收 所有剩余 个文件,作为一个数组。

顺便说一句:

给定时间戳字符串的格式,您可以按原样使用它们进行比较,因为词法比较将等同于按时间顺序比较。

如果您想将时间戳字符串转换为正确的 .NET [datetime] 实例,请执行以下操作:

$timeStamps = Get-ChildItem *.xlsx | ForEach-Object { 
  [datetime]::ParseExact(($_.Name -split '[-.]')[-2], 'yyyyMMdd_HHmmss', $null) 
}

【讨论】:

    【解决方案2】:

    为了从文件中提取时间戳,您可以使用-split "-"

    这将为您提供一个在每个分隔符之后划分的字符串数组。

    $files = Get-ChildItem -Path ./Path-to-files
    $timestamp = $files.BaseName -split "-"
    

    $timestamp 变量现在包含来自两个文件的字符串数组。使用索引操作,您可以选择时间戳并进行比较。除了拆分 $files 变量中的所有文件,您当然也可以循环遍历每个文件并将时间戳直接分配给变量。

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2014-04-21
      • 2021-02-03
      • 2023-04-02
      相关资源
      最近更新 更多