首页 > 解决方案 > 如何将日期时间从 PowerShell 输出转换为 yyyy-MM-dd HH:mm:ss 格式

问题描述

在尝试从 PS 将 lastLogon 日期写入 DB 时,我得到了输出10-10-2021 21:14:40,但是当将其写入我的 DB(MS SQL)时,日期转换1900-01-01 00:00:00.000而不是2021-10-10 21:14:40.000使用 eg 转换输出的任何尝试$DateStr = $lastLogon.ToString("yyyy-MM-dd HH:mm:ss.sss")到目前为止都失败了

我的 PS 脚本:

.....
Import-Module ActiveDirectory
Add-Type -AssemblyName System.Web

$EmploymentUser = Invoke-SQL -sqlCommand "select * from EmploymentUser where LastFlowEditDate Is Not NUll AND (EndDate Is Null OR EndDate > CURRENT_TIMESTAMP) AND StartDate < CURRENT_TIMESTAMP ORDER BY Initials;"

foreach($User in $EFP_EmploymentUser)
{
Get-ADUser $User.Initials -Properties lastLogon | Select @{Name="lastLogon";Expression={[datetime]::FromFileTime($_.'lastLogon')}}

    Invoke-SQL -sqlCommand "UPDATE EFP_EmploymentUser SET lastLogonAD  = '$($lastLogon)' WHERE ID like $($User.ID)"

}

有谁能帮忙吗?

标签: sql-serverpowershellpowershell-4.0

解决方案


使用ISO 8601格式的日期时间字符串 - 例如2021-10-10T21:14:40- 您可以使用标准s格式说明符获得:

foreach ($user in $EFP_EmploymentUser) {

  $lastlogon = [datetime]::FromFileTime(
    (Get-ADUser $User.Initials -Properties lastLogon).lastlogon
  )

  Invoke-SQL -sqlCommand "
      UPDATE EFP_EmploymentUser
      SET lastLogonAD  = '$($lastLogon.ToString('s'))'
      WHERE ID like $($user.ID)
    "

}

使用 ISO 8601 格式字符串的优点在于它是根据定义文化不变的

一个简化的例子,使用Get-Date

PS> (Get-Date).ToString('s')
2021-10-10T17:42:41

注意:如果Get-Date碰巧涉及到,你可以更简单地使用它的-Format参数:

PS> Get-Date -Format s
2021-10-10T17:42:41

至于你尝试了什么:

您的代码的主要问题是您尝试使用未定义的变量 ,$lastlogon而不是访问由您的调用创建的当前管道输入对象的.lastlogon 属性。$_Select-Object

在字符串插值的上下文中(在"..."字符串内部),未定义的$lastlogon变量扩展为空字符串,这就是 SQL 命令最终分配它支持的最早日期时间值的原因,1900-01-01 00:00:00.000

此外,您的Get-ADUser ...语句未连接到Invoke-SQL调用,因此前者的输出(具有通过创建的计算属性的[pscustomobject]实例)被简单地传递。 .lastlogonSelect-Object


推荐阅读