Можно ли фильтровать с помощью Get-ChildItem -Name? - PullRequest
1 голос
/ 17 июня 2019

В на один из вопросов Я недавно ответил, я нашел интересный ответ, который не должен работать, но все же был. Вопрос был в том, как рекурсивно найти конкретную папку по ее имени и cd к ней.

Ответ , предложенный Гостем, которого зовут Редд , был:

Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10

Согласно документации Get-ChildItem , параметр -Name должен иметь тип SwitchParameter и отвечает за возврат только имени (System.String) вместо System.Object.

Как возможно, что решение все еще работает?


MCVE:

# cd C:\SO\56628221
mkdir test, test1, test2, test3
mkdir .\test2\folder
Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10

Токовый выход:

test2\folder

Ожидаемый результат:

Get-ChildItem : A positional parameter cannot be found that accepts argument 'Folder'.

Что я пробовал?

  1. Сначала я проверил, что -Path является единственным позиционным параметром. Видимо, это:

Get-ChildItem -Path documentation

Все остальные параметры имеют Position: Named.

  1. Затем я попытался переключить аргументы на что-то вроде этого:
Get-ChildItem -Path .\ Folder -Name -Recurse -Depth 10

Это все еще работало, так что было ясно, что то, что я передаю командлету, не является значением для -Name.

  1. Последнее, что я предположил, было то, что я просто отправил массив строк в -Path. Я пытался сделать это явно:
[string[]]$a = '.\','Folder'
$a.GetType()
Get-ChildItem -Path $a -Name -Recurse -Depth 10

# Output:
PS C:\SO\56628221> $a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String[]                                 System.Array


PS C:\SO\56628221> Get-ChildItem -Path $a -Name -Recurse -Depth 10
test
test1
test2
test3
test2\folder
Get-ChildItem : Cannot find path 'C:\SO\56628221\Folder' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Path $a -Name -Recurse -Depth 10
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\SO\56628221\Folder:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

1 Ответ

1 голос
/ 17 июня 2019

tl; dr:

Видимо, в текущей версии документации Get-ChildItem неверная информация о том, что -Filter больше не позиционный.

выше, больше не верно, это было исправлено в этом PR .


Длинный ответ:

Фактически, значение 'Папка' передается -Filter параметр.Даже если в документации PowerShell 6 указано иное , -Filter - это позиционный параметр.По ошибке это изменение было введено в PowerShell v6 + , в то время как справочная статья PowerShell 5.1 для Get-ChildItem по-прежнему верна.

Командлет, который вы запускаете:

Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10

,эффективно:

Get-ChildItem -Path ".\" -Name -Filter "Folder" -Recurse -Depth 10

Хотя параметр -Filter в Get-ChildItem может быть сложным при использовании , в этом случае он работает отлично, и фильтр применяется только для отображения элементов с именем 'Папка».Поскольку этот вызов не указывает -File или -Directory, если вы запустите:

# Create new file named 'Folder'
New-Item Folder

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

PS C:\SO\56628221> Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10
Folder
test2\folder

Вывод точно такой же, если вы явно используете -Filter:

PS C:\SO\56628221> Get-ChildItem -Path .\ -Name -Filter Folder -Recurse -Depth 10
Folder
test2\folder
...