windows - 使用变量后 PowerShell 命令失败
问题描述
我正在尝试运行命令来收集具有某些要求的使用配置文件,这是我的代码:
#$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]
yield 0
)。
至于问题#2:
至少在非域计算机上的 Windows 10 上,该.LastUseTime
属性似乎总是返回当前日期和时间,这 (a) 使它无用,并且 (b) 解释了为什么您没有看到任何结果。
如果.LastDownloadTime
该字段在您的情况下具有值,您可以尝试检查- 我认为它只有在配置文件是漫游配置文件时才会具有值。
作为参考,这里是可用时间戳的完整列表:
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'
}
推荐阅读
- java - 使用 Helper 类简化复制粘贴过程
- amazon-web-services - 多个 Lambda 的 CloudFormation 警报
- spring - Spring AMQP Rabbit 监听器在“ApplicationReadyEvent”之前触发
- python - 如何打印文本文件中除第一行之外的所有行?
- r - 曲线平滑
- elixir - 检查所有测试文件是否可编译
- android - React-native fetch Api 获取响应不同于调试模式和普通模式
- c - 如何添加两个包含长数字的字符串?在 C 中
- web-scraping - F# 中的网络爬取
- vb.net - 检测 DataGridView 单元格中的符号