powershell - 将字符串解析为日期时间格式
问题描述
我在我的计算机上安装了所有软件,并将结果打印到 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
解决方案
正如@arco444 指出的那样,您需要从正在解析的数据中删除空InstallDate
结果,然后展开属性。此外,您的循环当前将解析的日期分配回循环迭代的数组变量,从而破坏该数组中的所有其他值。
正如@Moerwald 所建议的那样,建议使用InvariantCulture
而不是,但这不是问题的原因。另一个(性能)优化将使用字符串方法而不是运算符。$null
Contains()
-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')
}
}
推荐阅读
- keras - 深度学习 - 对给定图像是否是异常/新奇/异常值进行分类?
- algorithm - 查找二维数组中所有峰值的高效算法
- c# - 如何从字符串计算浮点值
- php - 使用 PHP 会话打开新的 android 活动
- azure-cosmosdb - Cosmos DB id 和 partitionKey 中的受限字符
- c++ - 我们可以使用 !islessgreater(float a, float b) 来检查 a==b 给定 a 和 b 都不是 nan
- django - django ORM 问题 - 注释和聚合返回不一致的值
- python - 侧边栏菜单应基于基于角色的登录 django 加载
- asp.net-mvc - 从登录 Asp.net 核心中排除自定义异常类
- kubernetes - 我的 pod 处于 Container Creating 状态,显示 TLS 握手超时