如何将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
相关产品推荐
相关产品推荐

