Как получить уникальные значения из этого массива в PowerShell?

Вопрос:Почему приведенный ниже код возвращает $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 Более

Вопрос:

Почему приведенный ниже код возвращает $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

Оцените статью
Добавить комментарий