You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PowerShell输出的datetime转换为yyyy-MM-dd HH:mm:ss格式

问题原因

  • 变量名不匹配:你查询得到的用户列表变量是$EmploymentUser,但循环遍历用的是不存在的$EFP_EmploymentUser,导致循环没有正常执行
  • 未对Get-ADUser返回结果赋值:你执行Get-ADUser后直接输出了结果,没有把计算得到的lastLogon值赋值给对应变量,导致写入SQL时变量为空,SQL会把空日期默认识别为1900-01-01 00:00:00.000
  • 日期格式化参数错误:你写的格式化字符串yyyy-MM-dd HH:mm:ss.sss有误,毫秒的格式化符是fff而非sss,重复的s会导致格式错误
  • 直接拼接SQL语句不仅存在注入风险,也容易因为特殊字符导致语句执行失败,ID字段作为唯一标识用=匹配即可,不需要用like做模糊匹配

修正后的代码

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 $EmploymentUser)
{
    $adUser = Get-ADUser $User.Initials -Properties lastLogon 
    # 过滤从未登录过的用户,避免写入无效日期
    if ($adUser.lastLogon -ne 0) {
        $lastLogonDate = [datetime]::FromFileTime($adUser.lastLogon)
        $formattedDate = $lastLogonDate.ToString("yyyy-MM-dd HH:mm:ss.fff")
        Invoke-SQL -sqlCommand "UPDATE EFP_EmploymentUser SET lastLogonAD  = '$formattedDate' WHERE ID = $($User.ID)"
    }
}

额外优化建议

有条件的话建议使用参数化查询代替字符串拼接,彻底避免SQL注入风险和日期格式匹配问题。

内容的提问来源于stack exchange,提问作者Stig Kølbæk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:54:02