首页 > 解决方案 > 使用变量后 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。它完全失败了。我真的可以使用一些输入来说明为什么会发生这种情况。

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

标签: windowspowershellscriptinguser-profile

解决方案


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

推荐阅读