Powershell将字符串转换为日期

时间:2018-01-08 15:30:15

标签: powershell datetime

我正在整理一些自定义监控解决方案,日志包含不同的日期/时间条目。尝试从日志中解析日期/时间(文本值)并转换为日期值,以便我可以与其他人或系统日期进行比较。我过去曾使用过以下内容,但我无法更改为允许单位数DD值和12小时时钟值。

$line = "=== 2018-01-07 03:30:25,889 [ng)'] INFO"

$dateTimeString = [regex]::Matches($line, '(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)')[0].Groups[1].Value

$provider = New-Object System.Globalization.CultureInfo "en-US"

$dateTime = [datetime]::ParseExact($dateTimeString, 'yyyy-MM-dd HH:mm:ss', $provider)

但需要转换以下内容。

$ line =“错误 - 2018年1月7日美国东部时间上午2:13:19 - 警告”

我确定parseexact将是: $ dateTime = [datetime] :: ParseExact($ dateTimeString,'MMM d,yyyy h:mm:ss tt',provider)

但是我在使用Matches函数将文本解析为这些值时遇到了问题。

编辑: 在使用Bill的建议之后,当明确地分配变量时,它可以工作。但是,当我将Get-Content假脱机到变量时,它不会。

$line = Get-Content $SBWebPath | Select-String $SBError -casesensitive |select -last 1
Write-Output $line
$line | Select-String '^####<(\S+ \S+, \S+ \S+ \S+) \S+> <Warning>' | ForEach-Object {
$dateTime = $_.Matches[0].Groups[1].Value -as [DateTime]
}
$dateTime

输出:

####<Dec 7, 2017 5:17:26 AM EST> <Warning> <HTTP>

EDIT2:

如Bill所述,$ line被转换为数组,因此ForEach-Object无法解析数组。通过添加| Out-String到该行的末尾,然后它能够​​将其解析为字符串。

最终守则有效:

$line = Get-Content $SBWebPath | Select-String $SBError -casesensitive | Select -last 1 | Out-String
Write-Output $line
$line | Select-String '^####<(\S+ \S+, \S+ \S+ \S+) \S+> <Warning>' | ForEach-Object {
$dateTime = $_.Matches[0].Groups[1].Value -as [DateTime]
}
$dateTime

为所有人喝彩。

2 个答案:

答案 0 :(得分:0)

这是一种(相当短暂的)方式:

$line = "Error - Jan 7, 2018 2:13:19 AM EST - Warning"
$line | Select-String '^Error - (\S+ \S+, \S+ \S+ \S+) \S+ -' | ForEach-Object {
  $dateTime = $_.Matches[0].Groups[1].Value -as [DateTime]
}
$dateTime

这种方法的一个警告是你丢失了时区信息。

要为整个文件执行此操作,您可以编写与此类似的内容:

Get-Content file.txt | ForEach-Object {
  # $_ here means "current line from input file"
  $_ | Select-String '^Error - (\S+ \S+, \S+ \S+ \S+) \S+ -' | ForEach-Object {
    # $_ here means "current MatchInfo object"
    $_.Matches[0].Groups[1].Value -as [DateTime]
  }
}

答案 1 :(得分:0)

我使用Get-Date命令将字符串转换为日期,以避免围绕文化设置或本地计算机设置出现问题。

从URL https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-date?view=powershell-6引用示例4

(Get-Date -Year 2000 -Month 12 -Day 31).DayOfYear

我使用LastWriteTime命令更新了文件的修改日期。我解析了文件名以获得日期和时间。

$_.LastWriteTime = Get-Date -Year $y -Month $m -Day $d -Hour $h -Minute $n -Second $s

我更新整个文件目录的修改日期的代码如下。我已经包含了我在构建此脚本期间使用的所有额外的echo语句。希望这种冗长的语气可以帮助您更好地理解每个步骤。

Get-ChildItem 'C:\*.jpg' | ForEach-Object {

    # File Info
    echo $_.FullName
    echo $_.BaseName
    echo $_.BaseName.IndexOf(" . ")
    echo $_.BaseName.SubString(26,17)
    $y = $_.BaseName.SubString(26,4)
    $m = $_.BaseName.SubString(31,2)
    $d = $_.BaseName.SubString(34,2)
    $h = $_.BaseName.SubString(37,2)
    $n = $_.BaseName.SubString(39,2)
    $s = $_.BaseName.SubString(41,2)
    $date = "$y,$m,$d,$h,$n,$s"
    echo $date

    # Modified Date
    echo $_.LastWriteTime

    # Update Modified Date
    $_.LastWriteTime = Get-Date -Year $y -Month $m -Day $d -Hour $h -Minute $n -Second $s
    echo $_.LastWriteTime
}