我正在尝试运行命令来收集具有某些要求的使用配置文件,这是我的代码:
#$numberOfDays = 30
#$numberOfDays
$profileStructsToRemove = Get-CimInstance Win32_UserProfile |
Where-Object {$_.LastUseTime -lt $(Get-Date).Date.AddDays(-$numberOfDays) } |
Where-Object {$_.LocalPath.ToUpper() -ne 'C:\USERS\ADMINISTRATOR'} |
Where-Object {$_.LocalPath.ToUpper() -ne 'C:\USERS\SOME_PROFILE_TO_KEEP'} |
Where-Object {$_.LocalPath.ToUpper() -ne 'C:\USERS\PUBLIC'}
$profileStructsToRemove #print
我使用
$numberOfDays
变量来确定从今天的日期中减去我想要用作过滤器的天数。现在它已被注释掉,并且命令成功,尽管由于 $numberOfDays
未定义,我认为它使用的是空值?我不太确定,但它就是这样工作的......
但是,当我将
$numberOfDays
分配给 30 时,它根本无法用任何东西填充变量 $profileStructsToRemove
。它完全失败了。我真的可以用一些意见来解释为什么会发生这种情况。
$numberOfDays
时,该命令如何工作?它只是一个空值,还是对于 AddDays
函数将其视为 0?$numberOfDays
赋值后此命令会失败?gms0ulman 的有用答案很好地回答了问题 #1(将
$null
转换为 [int]
会产生 0
)。
至于问题#2:
至少在非域计算机上的 Windows 11 上:
.LastUseTime
属性似乎总是返回当前日期和时间.LastDownloadTime
,if该字段在您的情况下有一个值 - 我认为只有当配置文件是漫游配置文件时它才会有值。
LastAttemptedProfileDownloadTime
、
LastAttemptedProfileUploadTime
、
LastBackgroundRegistryUploadTime
、
LastDownloadTime
、
LastUploadTime
、
LastUseTime
。
优化问题中的代码:
.toUpper()
。
Where-Object
调用合并为一个调用,然后您可以使用
-notin
与 RHS 上的路径数组一起使用,而不是使用
-ne
与各个路径。
.LastUsedTime
进行比较可能毫无意义):
#requires -RunAsAdministrator
$profileStructsToRemove =
Get-CimInstance win32_userprofile |
Where-Object {
$_.LastUseTime -lt (Get-Date).Date.AddDays(-$numberOfDays) -and
$_.LocalPath -notin 'C:\USERS\ADMINISTRATOR',
'C:\USERS\SOME_PROFILE_TO_KEEP',
'C:\USERS\PUBLIC'
}
$(Get-Date).Date.AddDays($null)
$numberOfDays
为
null
时查看数据进行确认。