Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 如何在Powershell中解析和处理文件名中的日期?_Parsing_Date_Powershell - Fatal编程技术网

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

Parsing 如何在Powershell中解析和处理文件名中的日期?,parsing,date,powershell,Parsing,Date,Powershell,我有一系列日志文件,需要在其中插入一周中的某一天。例如,LOG-20141106-0000.TXT变为LOG-20141106-THR-0000.TXT 我发现这让我信服,我不知道我在做什么,以及我认为;我已经有一段时间没有使用powershell了 到目前为止,我已经用这个来重命名文件,但是我正在寻找一个可以提取日期的片段,允许我插入一周中的某一天,并在适当的时候插入它 $txtPath = "h:\logs" #source files $txtPath2 = "h:\logs\ne

我有一系列日志文件,需要在其中插入一周中的某一天。例如,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
需要被告知需要解析的字符串及其格式。您分别有
$\uuu0.BaseName.Substring(6,8)
yyyyMMdd
。因此,您要求
ParseExact
转换从位置6开始的8个字符。在实践中,我们可以看到:

"CLOG-20141031-9999.TXT".Substring(6,8)
0141031-
这将无法很好地解析,并且很可能导致
排序对象的意图失败

"CLOG-20141031-9999.TXT".Substring(5,8)
20141031
子字符串以位置0开始,因此第6个字符位于位置5。更新
子字符串
,这应该是朝着正确方向迈出的一步。这应该是你问题的根源

然后,根据你需要完成的工作,你可以使用这样的方法

PS M:\Scripts> ([string]([DateTime]::ParseExact("CLOG-20141031-9999.TXT".Substring(5,8),'yyyyMMdd',$null)).DayOfWeek).SubString(0,3)
Fri
如果文件总是以第一个连字符后的日期进行格式化,那么a
-split
对于日期提取同样有效,因为它对名称长度的更改更具弹性

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

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

"CLOG-20141031-9999.TXT".Substring(6,8)
0141031-
这将无法很好地解析,并且很可能导致
排序对象的意图失败

"CLOG-20141031-9999.TXT".Substring(5,8)
20141031
子字符串以位置0开始,因此第6个字符位于位置5。更新
子字符串
,这应该是朝着正确方向迈出的一步。这应该是你问题的根源

然后,根据你需要完成的工作,你可以使用这样的方法

PS M:\Scripts> ([string]([DateTime]::ParseExact("CLOG-20141031-9999.TXT".Substring(5,8),'yyyyMMdd',$null)).DayOfWeek).SubString(0,3)
Fri
如果文件总是以第一个连字符后的日期进行格式化,那么a
-split
对于日期提取同样有效,因为它对名称长度的更改更具弹性

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

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

"CLOG-20141031-9999.TXT".Substring(6,8)
0141031-
这将无法很好地解析,并且很可能导致
排序对象的意图失败

"CLOG-20141031-9999.TXT".Substring(5,8)
20141031
子字符串以位置0开始,因此第6个字符位于位置5。更新
子字符串
,这应该是朝着正确方向迈出的一步。这应该是你问题的根源

然后,根据你需要完成的工作,你可以使用这样的方法

PS M:\Scripts> ([string]([DateTime]::ParseExact("CLOG-20141031-9999.TXT".Substring(5,8),'yyyyMMdd',$null)).DayOfWeek).SubString(0,3)
Fri
如果文件总是以第一个连字符后的日期进行格式化,那么a
-split
对于日期提取同样有效,因为它对名称长度的更改更具弹性

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

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

"CLOG-20141031-9999.TXT".Substring(6,8)
0141031-
这将无法很好地解析,并且很可能导致
排序对象的意图失败

"CLOG-20141031-9999.TXT".Substring(5,8)
20141031
子字符串以位置0开始,因此第6个字符位于位置5。更新
子字符串
,这应该是朝着正确方向迈出的一步。这应该是你问题的根源

然后,根据你需要完成的工作,你可以使用这样的方法

PS M:\Scripts> ([string]([DateTime]::ParseExact("CLOG-20141031-9999.TXT".Substring(5,8),'yyyyMMdd',$null)).DayOfWeek).SubString(0,3)
Fri
如果文件总是以第一个连字符后的日期进行格式化,那么a
-split
对于日期提取同样有效,因为它对名称长度的更改更具弹性

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