полезный ответ gms0ulman хорошо отвечает на вопрос № 1 (преобразование $null
в [int]
дает 0
).
Что касается вопроса № 2:
По крайней мере в Windows 10 на компьютере, не являющемся доменом, свойство .LastUseTime
, по-видимому, всегда возвращает текущую дату и время , что (а) делает его бесполезным и (б)объясняет, почему вы не видите никаких результатов.
Вместо этого можно попробовать .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'
}