PowerShell正则替换中转换DateTime格式失败,求正确语法
PowerShell正则替换中日期转换错误解决
问题背景
使用PowerShell 5.1.23560.1000,现有input.txt内容:
@{Name=file1.txt; LastAccessTime=10/22/2023 6:59:16 PM} @{Name=file2.txt; LastAccessTime=10/22/2023 6:59:22 PM}
需要将每行的日期时间转换为yyyyMMddHHmmss格式,和文件名一起输出,预期结果:
20231022185916 file1.txt 20231022185922 file2.txt
执行以下命令后出现转换错误:
Get-Content 'input.txt' | % { $_ -replace '^.*=(.*); Last\w+Time=(.*)}.*$', ($(([datetime]'$2').ToString('yyyyMMddHHmmss')) + "`t" + '$1') }
错误提示无法将字符串"$2"转换为DateTime类型。
错误原因
-replace的替换参数如果是普通字符串表达式,$2这类分组引用只有在替换阶段才会被解析,但你把([datetime]'$2')放在了括号里,这部分会在正则匹配前就被执行,此时$2只是字面量字符串,不是捕获到的日期内容,所以转换失败。
要对捕获的分组内容做处理,必须用脚本块作为替换值,PowerShell 5.1支持这种用法,脚本块内可以通过$matches变量访问捕获的分组。
正确命令
多行写法(可读性更好)
Get-Content 'input.txt' | ForEach-Object { $_ -replace '^.*=(.*); Last\w+Time=(.*)}.*$', { # 从匹配结果中获取日期字符串和文件名 $dateTime = [datetime]$matches[2] $formattedDate = $dateTime.ToString('yyyyMMddHHmmss') # 拼接成目标格式 "$formattedDate`t$($matches[1])" } }
单行写法
Get-Content 'input.txt' | % { $_ -replace '^.*=(.*); Last\w+Time=(.*)}.*$', { "$(([datetime]$matches[2]).ToString('yyyyMMddHHmmss'))`t$($matches[1])" } }
说明
- 脚本块作为替换值时,PowerShell会自动将当前正则匹配的结果存入
$matches集合,$matches[1]对应第一个捕获组(文件名),$matches[2]对应第二个捕获组(日期时间字符串)。 - 在脚本块内可以正常对捕获的内容进行类型转换、格式化等操作,最后返回拼接好的字符串作为替换结果。
内容的提问来源于stack exchange,提问作者Ωmega
相关产品推荐
相关产品推荐

