В на один из вопросов Я недавно ответил, я нашел интересный ответ, который не должен работать, но все же был. Вопрос был в том, как рекурсивно найти конкретную папку по ее имени и 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'.
Что я пробовал?
- Сначала я проверил, что
-Path
является единственным позиционным параметром. Видимо, это:
Все остальные параметры имеют Position: Named
.
- Затем я попытался переключить аргументы на что-то вроде этого:
Get-ChildItem -Path .\ Folder -Name -Recurse -Depth 10
Это все еще работало, так что было ясно, что то, что я передаю командлету, не является значением для -Name
.
- Последнее, что я предположил, было то, что я просто отправил массив строк в
-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