比较日期并分配给每个变量

时间:2019-11-23 11:54:27

标签: powershell compare

我在目录中有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 个答案:

答案 0 :(得分:1)

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

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

  • Sort-Object接收脚本块({ ... })作为标准,该脚本块通过用$_.Name分割每个输入文件名(-)中的时间戳。和.个字符并提取结果倒数第二个([-2])令牌。

  • (...).FullName使用成员枚举来提取已排序文件信息对象的全名(路径)。

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

顺便说一句:

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

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

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

答案 1 :(得分:0)

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

这将为您提供在每个定界符之后分割的字符串数组。

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

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