任何想法为什么以下不起作用?
............................................... .................................................. .................................................. .................................................. .................................................. ..........................
$files = @'
name 14122012 text.doc
things 08092003.docx
hi v03.03 text 05062007 file.txt
hello world 31052006.ppt
names v04 12122012.xml
sdsf 29082013 dsf.php
'@ -split '\n'
foreach ($File in $files) {
$file -match '(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])(19|20)[0-9]{2}' | Out-Null
$File -replace "$(($matches).values)" , "$(get-date "$(($matches).Values)" -Format yyyyddMM)"
}
powershell输出错误,由于某种原因,它试图将“20 12 14”添加到字符串进行转换:S
Get-Date : Cannot bind parameter 'Date'. Cannot convert value "20 12 14 14122012" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
At line:13 char:9
+ get-date <<<< "$(($matches).Values)" -Format yyyyddMM
+ CategoryInfo : InvalidArgument: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
和
$files = @'
11.12.2012
11.12.12
15 12 2013
5 06 2013
'@ -split '\n'
foreach ($File in $files) {
$file -match '\d{2}\.\d{2}\.\d{2,4}' | Out-Null
$file -match '(0[1-9]|[12]\d|3[01])\s\d{2}\s\d{2,4}'| Out-Null
$File -replace "$(($matches).values)" , "$(get-date "$(($matches).Values)" -Format yyyyMMdd)"
}
15 12 2013
Get-Date : Cannot bind parameter 'Date'. Cannot convert value "15 15 12 2013" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
At line:13 char:9
+ get-date <<<< "$(($matches).Values)" -Format yyyyMMdd
+ CategoryInfo : InvalidArgument: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
5 06 2013
Get-Date : Cannot bind parameter 'Date'. Cannot convert value "15 15 12 2013" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
At line:13 char:9
+ get-date <<<< "$(($matches).Values)" -Format yyyyMMdd
+ CategoryInfo : InvalidArgument: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
答案 0 :(得分:2)
它正在做它应该做的事情。 $ matches是基本捕获(0)和每个捕获组的哈希表:
$text = 'name 14122012 text.doc'
$regex = $file -match '(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])(19|20)[0-9]{2}' | Out-Null
$matches
Name Value
---- -----
3 2013
2 08
1 29
0 29082013
当您将值集合作为字符串输出时,它会将空格分开:
"$(($matches).values)"
2013 08 29 29082013
这是任何转换为字符串的集合的正常行为。您可以通过更改输出字段分隔符($ OFS)
来更改默认空间中的分隔符$OFS = ';'
"$(($matches).values)"
2013;08;29;29082013
话虽这么说,你真的不需要跳过日期转换圈。您已经拥有了所需的所有数据:
$files = @'
name 14122012 text.doc
things 08092003.docx
hi v03.03 text 05062007 file.txt
hello world 31052006.ppt
names v04 12122012.xml
sdsf 29082013 dsf.php
'@ -split '\n'
foreach ($File in $files) {
$file -match '(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])((?:19|20)[0-9]{2})' | Out-Null
$File -replace "$($matches[0])" , ($matches[3,2,1] -join '')
}
name 20121214 text.doc
things 20030908.docx
hi v03.03 text 20070605 file.txt
hello world 20060531.ppt
names v04 20121212.xml
sdsf 20130829 dsf.php
它只是对正则表达式进行了一次小的重新分解以捕获所有年份的数字,然后以正确的顺序排列捕获并将它们连接在一起。
答案 1 :(得分:0)
你的第一个问题是你没有捕捉整年(只有前两位数字),所以你需要移动群组捕获括号:
$file -match '(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])(19|20[0-9]{2})'
此外,$matches
返回一个数组,其中包含第一个元素中的整个匹配字符串,后跟每个捕获组的元素。
例如:
"name 14122012 text.doc" -match '(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])(19|20[0-9]{2})'
$matches
Name Value
---- -----
3 2012
2 12
1 14
0 14122012
所以你必须以get-date所希望的格式重新组合字符串。在我的语言环境中,它看起来像这样:
$matches[2,1,3] -join " "
12 14 2012
如果您的语言环境首先需要月份日期,那么:
$matches[1..3] -join " "
14 12 2012
然后给出:
$File -replace "$($matches[0])" , "$(get-date $($matches[2,1,3] -join ' ') -Format yyyyddMM)"
为你的第二行。