使用变量后 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
。它完全失败了。我真的可以使用一些输入来解释为什么会这样。
- 未定义
$numberOfDays
时命令如何工作?对于 AddDays
函数,它只是一个空值,还是将其视为 0?
- 为什么这个命令在
$numberOfDays
被赋值后失败?
是的,它是空的,它添加了零天。这很好 - 你可以测试:
$(Get-Date).Date.AddDays($null)
您确定有符合该数据的配置文件吗?当$numberOfDays
为null
时查看数据确认。
很好地回答了问题 #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'
}
我正在尝试 运行 一个命令来收集具有特定要求的使用配置文件,这是我的代码:
#$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
被赋值后失败?
是的,它是空的,它添加了零天。这很好 - 你可以测试:
$(Get-Date).Date.AddDays($null)
您确定有符合该数据的配置文件吗?当
$numberOfDays
为null
时查看数据确认。
$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'
}