Вопрос:
Почему приведенный ниже код возвращает $null? Я пытаюсь сохранить только уникальные значения.
$DailyPathsToDelete = @(«C:tempIMG000483″,»C:tempIMG000483») $DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique Лучший ответ:
Вы можете попробовать:
$unique = $DailyPathsToDelete | Get-Unique Ответ №1
Краткий ответ:
Чтобы получить все уникальные пути, вы должны передать $DailyPathsToDelete к Select-Object и установить переключатель Unique.
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
Более длинный ответ:
1. Почему это не работает
После запуска вашего скрипта $DailyPathsToDelete равняется $null, потому что (во второй строке вашего скрипта) $DailyPathsToDelete связан с параметром Property. Параметр InputObject командлета Select-Object не был не указан, поэтому результатом вызова Select-Object является $null.
Это легко проверить, проследив выражение вашего лица:
Trace-Command -psHost -Name ParameterBinding { Select-Object $DailyPathsToDelete -Unique}
дает:
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Select-Object] DEBUG: ParameterBinding Information: 0 : BIND arg [True] to parameter [Unique] DEBUG: ParameterBinding Information: 0 : COERCE arg to [System.Management.Automation.SwitchParameter] DEBUG: ParameterBinding Information: 0 : Parameter and arg types the same, no coercion is needed. DEBUG: ParameterBinding Information: 0 : BIND arg [True] to param [Unique] SUCCESSFUL DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Select-Object] DEBUG: ParameterBinding Information: 0 : BIND arg [System.Object[]] to parameter [Property] DEBUG: ParameterBinding Information: 0 : BIND arg [System.Object[]] to param [Property] SUCCESSFUL DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Select-Object] DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
2. Как это исправить
Используя Select-Object:
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
Используя Sort-Object:
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique
3. Как НЕ это исправить
Я бы не советовал использовать Get-Unique в вашем сценарии, поскольку локальные файловые системы Windows (NTFS, FAT и варианты) не чувствительны к регистру.
Пример:
$DailyPathsToDelete = @(«C:tempIMG000483″,»C:TempIMG000483») PS C:> $DailyPathsToDelete | get-unique C:tempIMG000483 C:TempIMG000483 Ответ №2
-
С Get-Unique, gotcha – Get-Unique чувствителен к регистру, и вам также нужно сначала отсортировать список!
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object | Get-Unique
-
С Select-Object
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
-
С Sort-Object
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique