我在一个文件夹中有一系列文件名称: - myFile201801010703.file
我正在尝试解析文件夹中每个文件名的yyyymmdd部分,并根据日期对数组进行排序.
所以,如果我有以下文件:
它会将它们分类为一个数组:
我有一个适用于名称中包含时间戳的文件的进程,但是只能在日期工作时无法调整它:
# RegEx pattern to parse the timestamps
$Pattern = '(\d{4})(\d{2})(\d{2})*\' + ".fileExtension"
$FilesList = New-Object System.Collections.ArrayList
$Temp = New-Object System.Collections.ArrayList
Get-ChildItem $SourceFolder | ForEach {
if ($_.Name -match $Pattern) {
Write-Verbose "Add $($_.Name)" -Verbose
$Date = $Matches[2],$Matches[3],$Matches[1] -join '/'
$Time = $Matches[4..6] -join ':'
[void]$Temp.Add(
(New-Object PSObject -Property @{
Date = [datetime]"$($Date) $($Time)" #If I comment out $($Time)it doesn't work.
File = $_
}
))
}
}
} catch {
Write-Host "`n*** $Error ***`n"
}
# Sort the files by the parsed timestamp and add to $FilesList
$FilesList.AddRange(@($Temp | Sort Date | Select -Expand File))
# Clear out the temp collection
$Temp.Clear()
Run Code Online (Sandbox Code Playgroud)
我认为可能是罪魁祸首的两条线是:
$Time = $Matches[4..6] -join ':' 因为我不是在解析任何时间
Date = [datetime]"$($Date) $($Time)"再次,没有时间被解析.似乎无法改变日期类型?
使用这种格式:
myFileYYYYMMddHHmm.file
Run Code Online (Sandbox Code Playgroud)
日期和时间的各个部分已经从最大(年)到最小(分钟)排列 - 这使得字符串可以排序!
我们唯一需要做的就是在扩展名之前获取文件名的最后12位数字:
$SortedArray = Get-ChildItem *.file |Sort-Object {$_.BaseName -replace '^.*(\d{12})$','$1'}
Run Code Online (Sandbox Code Playgroud)
使用的正则表达式模式:
^.*(\d{12})$
Run Code Online (Sandbox Code Playgroud)
可细分如下:
^ # start of string
.* # any character, 0 or more times
( # capture group
\d{12} # any digit, 12 times
) # end of capture group
$ # end of string
Run Code Online (Sandbox Code Playgroud)
正则表达式引擎将$1在替换字符串中扩展为"捕获组#1",即.我们最后收到的12位数字.
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |