我正在尝试运行一个命令来收集具有特定要求的使用配置文件,这是我的代码:
#$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's helpful answer很好地回答了问题 #1(将 $null
转换为 [int]
会产生 0
)。
关于问题 #2:
至少在非域计算机上的 Windows 10 上,.LastUseTime
属性似乎总是返回当前日期和时间,这(a) 让它变得毫无用处,并且 (b) 解释为什么你没有看到任何结果。
您可以尝试检查 .LastDownloadTime
,if 该字段在您的情况下有值 - 我认为只有在配置文件为 < em>漫游 配置文件。
作为引用,这里是可用时间戳的完整列表:
LastAttemptedProfileDownloadTime
、LastAttemptedProfileUploadTime
、LastBackgroundRegistryUploadTime
、LastDownloadTime
、LastUploadTime
、LastUseTime
.
关于一般如何优化问题中的代码:
默认情况下,PowerShell 字符串运算符不区分大小写,因此不需要
.toUpper()
。您可以将多个
Where-Object
调用合并为一个调用,并且可以使用
-notin
使用 RHS 上的一组路径,而不是使用-ne
和单个路径。
将它们放在一起(PSv3+;请记住,与 .LastUsedTime
进行比较可能毫无意义):
$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'
}
关于windows - 使用变量后 PowerShell 命令失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52632465/