首页 > 解决方案 > 将字符串解析为日期时间格式

问题描述

我在我的计算机上安装了所有软件,并将结果打印到 HTML 表中。但是很多日期都有yyyyMMdd格式,但我想要yyyy-MM-dd格式。

Windows 10
Powershell 版本 - 5.1.17

$Soft = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*;
#$Soft64 =  Get-ItemProperty HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*;
$InstallDate = $Soft | Select-Object InstallDate;

for ($i = 0; $i -lt $InstallDate.Length; $i++) {
    if ($InstallDate[$i] -match '-') {
        $InstallDate[$i]
    } else {
        $InstallDate = [DateTime]::ParseExact($InstallDate[$i], 'yyyyMMdd', $null)
        $InstallDate.ToString('yyyy-MM-dd')
    }
}

列表中的一个日期格式2019-04-01

安装日期
------------
2019-04-01

但是不包含的日期-,例如20190319,抛出错误:

找不到“ParseExact”和参数计数的重载:“3”。
在 C:\Users\xxx\Desktop\xxx\ForLoopTest.ps1:12 char:9
+ $InstallDate = [日期时间]::ParseExact($InstallDate[$i], 'yyyy ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

找不到“ToString”的重载和参数计数:“1”。
在 C:\Users\xxx\Desktop\xxx\ForLoopTest.ps1:13 char:9
+ $InstallDate.ToString('yyyy-MM-dd')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

标签: powershell

解决方案


正如@arco444 指出的那样,您需要从正在解析的数据中删除空InstallDate结果,然后展开属性。此外,您的循环当前将解析的日期分配回循环迭代的数组变量,从而破坏该数组中的所有其他值。

正如@Moerwald 所建议的那样,建议使用InvariantCulture而不是,但这不是问题的原因。另一个(性能)优化将使用字符串方法而不是运算符。$nullContains()-match

这样的事情应该做你想做的事:

$reg = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$culture = [Globalization.CultureInfo]::InvariantCulture

$Soft = Get-ItemProperty $reg
$InstallDate = $Soft |
               Where-Object { $_.InstallDate } |
               Select-Object -Expand InstallDate

for ($i = 0; $i -lt $InstallDate.Length; $i++) {
    if ($InstallDate[$i].Contains('-')) {
        $InstallDate[$i]
    } else {
        $d = [DateTime]::ParseExact($InstallDate[$i], 'yyyyMMdd', $culture)
        $d.ToString('yyyy-MM-dd')
    }
}

流水线整个处理也是一种可能:

$reg = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$culture = [Globalization.CultureInfo]::InvariantCulture

Get-ItemProperty $reg | Where-Object {
    $_.InstallDate
} | Select-Object -Expand InstallDate | ForEach-Object {
    if ($_.Contains('-')) {
        $_
    } else {
        [DateTime]::ParseExact($_, 'yyyyMMdd', $culture).ToString('yyyy-MM-dd')
    }
}

推荐阅读