如何在Powershell中解析和处理文件名中的日期?

时间:2014-11-06 14:56:15

标签: parsing date powershell

我有一系列日志文件,我需要在其中插入星期几。例如,LOG-20141106-0000.TXT变为LOG-20141106-THR-0000.TXT。

我发现this question说服了我,我不知道我在做什么,就像我想的那样;自从我使用PowerShell以来已经有一段时间了。

到目前为止,我已经将其重命名为文件了,但我正在寻找能够提取日期的文章,允许我插入星期几并插入适当的文件。

$txtPath = "h:\logs"     #source files
$txtPath2 = "h:\logs\new"   #renamed files

Get-ChildItem $txtPath | foreach { 
    Move-Item $txtPath $txtPath2 ($_.Name -replace 'LOG','CLOG') 
}

我很难用这个来拉日期:

$file = Get-ChildItem $txtpath | 
Sort-Object { [DateTime]::ParseExact($_.BaseName.Substring(6,8),'yyyyMMdd',$null) } |
Select-Object -Last 1

收到错误,指示起始索引不能长于字符串的长度。 H:\ logs(我觉得我指向的地方)有五个名为CLOG-20141031-9999.TXT的文件,其中9999是每个文件的不同序列号。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

ParseExact需要告诉它需要解析的字符串以及格式化的方式。您分别有$_.BaseName.Substring(6,8)yyyyMMdd。所以你要求ParseExact从postition 6开始转换8个字符。在实践中我们可以看到:

"CLOG-20141031-9999.TXT".Substring(6,8)
0141031-

哪个不能很好地解析,最有可能使Sort-Object意图失败

"CLOG-20141031-9999.TXT".Substring(5,8)
20141031

子字符串以postition 0开头,因此第6个字符位于第5位。更新Substring,这应该是朝着正确方向迈出的一步。那应该是你问题的根源。

然后根据您在工作日需要完成的工作,您可以使用类似的东西。

PS M:\Scripts> ([string]([DateTime]::ParseExact("CLOG-20141031-9999.TXT".Substring(5,8),'yyyyMMdd',$null)).DayOfWeek).SubString(0,3)
Fri

如果文件总是使用第一个连字符后的日期进行格式化,则-split对于日期提取也会起作用,因为对名称长度的更改更有弹性。

"CLOG-20141031-9999.TXT".Split("-")[1]
20141031