使用变量后 PowerShell 命令失败

PowerShell command fails after variable is used

我正在尝试 运行 一个命令来收集具有特定要求的使用配置文件,这是我的代码:

#$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。它完全失败了。我真的可以使用一些输入来解释为什么会这样。

  1. 未定义 $numberOfDays 时命令如何工作?对于 AddDays 函数,它只是一个空值,还是将其视为 0?
  2. 为什么这个命令在 $numberOfDays 被赋值后失败?
  1. 是的,它是空的,它添加了零天。这很好 - 你可以测试:

    $(Get-Date).Date.AddDays($null)
    
  2. 您确定有符合该数据的配置文件吗?当$numberOfDaysnull时查看数据确认。

很好地回答了问题 #1(将 $null 转换为 [int] 会产生 0)。

关于问题 #2:

至少在 Windows 10 的非域机器上, .LastUseTime 属性 似乎总是 returns 当前 日期和时间,这 (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'
}