我在目录中有2个如下所示的带有时间戳(YYYYMMdd_HHmmss
)的excel文件。
目录中有2个excel文件。我将从目录中的文件名中提取时间戳,然后比较两个日期,最后为每个日期分配变量。
我想将$Start
的变量分配为report-capacity-server01.contoso.com-20191010_171044.xlsx.
我想将$End
的变量分配为report-capacity-server01.contoso.com-20191108_130454.xlsx.
答案 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
变量中的所有文件之外,您还可以遍历每个文件并将时间戳直接分配给变量。