【问题标题】:convert string to datetime in powershell 2.0在powershell 2.0中将字符串转换为日期时间
【发布时间】:2017-07-05 06:42:32
【问题描述】:

我正在尝试仅针对最近的条目解析文件。日志文件中的每个条目都以“m/d/yyyy h:mm:ss PM”格式的日期开头。

我编写了一个脚本来完成我想要的,但不幸的是这个脚本在 Powershell 5 上运行,而不是在 Powershell 2 上运行

$regex = '\b([1-2][0-9]|[0-9])\/([1-3][0-9]|[0-9])\/(20[0-9][0-9]) ((1[0-2]|0?[1-9]):([0-5][0-9]):([0-5][0-9]) ([AaPp][Mm]))'

$lines = gci C:\temp\Gateway.log | select-string -pattern $regex |select linenumber, matches
$log=@()
foreach($line in $lines)
{
    [datetime]$logdate = ($line.matches).value
    $ln = $line.linenumber

    if ($logdate -gt '2017-06-29 12:00:00')
    {
        $log += $ln
    }
}

$log

当我尝试使用 powershell 2 在服务器上运行此脚本时,我收到以下错误。

无法将 null 转换为类型“System.DateTime”。

我无法将选择字符串找到的值转换为日期时间。尝试使用 tostring 和 out-string 转换为字符串

  $dt = $line.matches
    $val = $dt|select Value
    $val1 = $val|Out-String
    $val2 = $val.tostring()
    [datetime]$val1
    [datetime]$val2

如何获取日期时间的值,以便在 powershell 2 中进行日期数学运算?

【问题讨论】:

  • 不管 PowerShell 版本如何,简单地将字符串转换为 DateTime 是一种糟糕的形式,因为它假定语言环境实际上接受该特定格式的日期/时间值。请改用[DateTime]::ParseExact($val1, "M/d/yyyy H:mm:ss tt", [CultureInfo]::InvariantCulture) 之类的东西。 (我忘记了是否有更 PowerShellian 的方式来做到这一点。)
  • 还请注意,您的正则表达式过于复杂:如果有人试图将14/68/3016 1:62:63 PM 伪装成有效的日期/时间,您真的不需要关心,只需让解析器找出无效的。 [0-9]+ 之类的东西适合简单的描绘工作。如果日期/时间恰好有固定大小或非空格分隔符,那就更简单了。
  • @JeroenMostert 大写H表示24小时制,改为小写h
  • 我认为我的问题不是日期转换,而是转换为字符串。当我尝试做 $val.tostring() 时返回 null。 val 的类型是 PSCustomObject。
  • @JeroenMostert 是的,我是正则表达式的新手,所以这是我发现对我有用的第一个示例。但我会考虑你的笔记,越简单越好。谢谢

标签: powershell powershell-2.0


【解决方案1】:

根据我的经验,如果您当前的语言环境设置不适用于上午/下午转换(也不适用于 [CultureInfo]::InvariantCulture)。

你需要指定一个支持am/pm的cultureinfo对象

$enUS = 'en-US' -as [Globalization.CultureInfo]
$val1 = (get-date).ToString("M/d/yyyy H:mm:ss tt", $enUS)
$val1
[DateTime]::ParseExact($val1, "M/d/yyyy H:mm:ss tt", $enUS)

【讨论】:

  • 我必须将匹配日期转换为数组,因为 tostring() 没有转换任何内容。 $enUS = 'en-US' -as [Globalization.CultureInfo] $dt = $line.matches $val = @($dt|%{$_.Value}) $val = $val[0].ToString() [日期时间]::ParseExact($val, "M/d/yyyy H:mm:ss tt", $enUS)
  • 注意大写H,根据these tables你需要小写h 12小时am/pm格式。
猜你喜欢
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2011-12-16
  • 2014-05-24
  • 1970-01-01
相关资源
最近更新 更多