【问题标题】:PowerShell command fails after variable is used使用变量后 PowerShell 命令失败
【发布时间】:2018-10-03 17:19:05
【问题描述】:

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

#$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 时,它根本无法用 ANYTHING 填充变量 $profileStructsToRemove。它完全失败了。我真的可以就为什么会发生这种情况提出一些意见。

  1. $numberOfDays 未定义时,该命令如何工作?它只是一个空值,还是将其视为 AddDays 函数的 0?
  2. 为什么一旦给$numberOfDays 赋值,这个命令就会失败?

【问题讨论】:

  • .AddDays() 需要一个整数。 $null 转换为 [int] 时为 0。[int]$null
  • @Birdman:请查看我的答案的更新。

标签: windows powershell scripting user-profile


【解决方案1】:

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

关于第二个问题:

至少在非域计算机上的 Windows 10 上,.LastUseTime 属性似乎总是​​返回 当前日期和时间,这 (a) 使其无用(b) 解释为什么您没有看到任何结果。

您可以尝试检查.LastDownloadTime如果该字段在您的情况下有一个值 - 我认为它只有在配置文件是 漫游 个人资料。


作为参考,以下是可用时间戳的完整列表:
LastAttemptedProfileDownloadTimeLastAttemptedProfileUploadTimeLastBackgroundRegistryUploadTimeLastDownloadTimeLastUploadTimeLastUseTime


至于如何优化您问题中的代码

  • 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'
}

【讨论】:

  • 您的答案与此代码的问题一致。因此,有些配置文件几个月未登录,但“LastUseTime”就像 1.5 周前一样。我不确定是否有更新或其他什么触发了这种情况。所以事实证明代码没问题,但该字段正在以某种方式更改。
【解决方案2】:
  1. 是的,它是 null,它增加了零天。这很好 - 你可以测试:

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

【讨论】:

  • 我将尝试通过手动查看 Get-CimInstance win32_userprofile 数据来验证所有配置文件的 LastUseTime,但只需在文件资源管理器中查看具有“修改日期”值的配置文件,就像2018 年 1 月,远远超过 30 天。也许 LastUseTime 没有反映文件资源管理器中的修改日期。我得比较一下。
  • 原来配置文件与数据不匹配。不知何故,即使有几个月未触及的配置文件(多个用户已离开公司),LastUseTime 字段仍在更新。多个配置文件同时更新了该字段。我不确定是什么原因造成的,但不是任何用户登录。目前正在尝试寻找替代解决方案...
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 2016-06-20
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多