繁体   English   中英

如何解析和使用Powershell中文件名中的日期?

[英]How do I parse and work with a date from a filename in Powershell?

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

我发现了这个问题 ,这使我确信我不知道自己在做什么,也没有想到的那样。 自从我使用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是每个文件的不同序列号。

我究竟做错了什么?

需要告知ParseExact需要解析的字符串以及其格式。 您分别有$_.BaseName.Substring(6,8)yyyyMMdd 因此,您要求ParseExact从位置6开始转换8个字符。实际上,我们可以看到以下内容:

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

这将无法很好地解析,并且很可能使Sort-Object的意图失败

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

子字符串以位置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对于日期提取同样有效,因为-split名称长度的更改更具弹性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM