Сбой команды PowerShell после использования переменной - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь запустить команду для сбора профилей использования с определенными требованиями, вот мой код:

#$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 не определено?Это просто нулевое значение или оно трактуется как 0 для функции AddDays?
  2. Почему эта команда не выполняется, если $numberOfDays присвоено значение?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

полезный ответ 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'
}
0 голосов
/ 03 октября 2018
  1. Да, это ноль, что добавило ноль дней.Это нормально - вы можете проверить с:

    $(Get-Date).Date.AddDays($null)
    
  2. Вы уверены, что есть профили, которые соответствуют этим данным?Проверьте данные, когда $numberOfDays равно null для подтверждения.

...