You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:53:13