【问题标题】:Extracting date from a file name in PowerShell从 PowerShell 中的文件名中提取日期
【发布时间】:2021-08-21 00:43:20
【问题描述】:

我已经编写了一个 PowerShell 脚本来从文件名中提取日期并据此删除。

示例文件名:TBTT_UAT_01012021_000019.csv

提取日期的代码:

  $fileDateText = ($filename -split '_')[4]
  $fileDate = [System.DateTime]::ParseExact($fileDateText, "dd/MM/yyyy", [System.Globalization.CultureInfo]::InvariantCulture)

但是当我运行脚本时出现以下错误,因为它可以识别 CSV 之前的日期:

字符串 '000019.csv' 未被识别为有效的 DateTime。: FormatException

有人可以建议吗?

谢谢,

【问题讨论】:

  • 您确定要解析的日期是拆分字符串的第 4 个元素而不是第 2 个或第 3 个元素吗?
  • 是的,它是元素 3 ,在 powershell 5 上运行良好,但我需要在 PowerShell 7 上运行。

标签: powershell


【解决方案1】:

我认为您可能正在查看从拆分返回的错误数组元素。此外,您在 .ParseExact() 的重载中提供的字符串可能已关闭。这似乎在我的测试中有效:

$fileDate = ("TBTT_UAT_01012021_000019.csv" -split '_')[2]
[DateTime]::ParseExact($fileDate, "ddMMyyyy", [System.Globalization.CultureInfo]::InvariantCulture)

返回:Friday, January 1, 2021 12:00:00 AM

如果您想更详细地了解我们必须以不同的方式切割字符串文件名的时间。

【讨论】:

  • 谢谢史蒂夫,它适用于我在 PowerShell 版本 5 上,但在 PowerShell 7 上,我遇到了同样的错误。
  • 我是 powershell 7 的新手,你知道是否有办法在 PoweShell 7 中做同样的事情吗?
  • 使用“3”个参数调用“ParseExact”的异常:“字符串'01012021'未被识别为有效的日期时间。”字符串 01012021 是 2021 年 1 月 1 日,它在 powershell 5 上被识别,但在 7 上没有。
  • 我看到你已经解决了这个问题。我相信问题是您可能没有更改字符串格式提供程序,如答案中所述。这是参数/重载#2:“ddMMyyyy”。如果你觉得舒服,请接受答案。谢谢。
  • 谢谢史蒂文。我已经接受了答案。
【解决方案2】:

问题已通过更改:

[System.DateTime]::ParseExact($fileDateText, "dd/MM/yyyy", [System.Globalization.CultureInfo]::InvariantCulture)

$fileDate = [DateTime]::ParseExact("$fileDateText", 'ddMMyyyy',[CultureInfo]::InvariantCulture)
【解决方案3】:
if ($filename -match '(?<Timestamp>\d{8})') {
    [DateTime]::ParseExact($Matches.Timestamp, 'ddMMyyyy', [CultureInfo]::InvariantCulture)
}

我倾向于使用命名提取组的正则表达式,而不是进行字符串操作。语法有点复杂,但生成的脚本最终更有弹性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多