2016-09-08 7 views
0

Я хотел бы получить все (и только) имена файлов второго уровня моего диска. Например, C:\folder1\folder2 и C:\folder1\folder3, мне нужно получить только folder2 и folder3.Верните только имена каталогов второго уровня

Я пишу это и PS отображает все имена каталогов:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer} | Select-Object Name 

Я нашел это help, и я могу изменить предыдущую команду таким образом:

Get-ChildItem -Recurse | `Where-Object {($_.directory -match '^*\\\S*$')} ` | ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name } 

, но когда я использую его PS ничего не отображает.

Я не могу понять, почему кто-то может мне помочь? Спасибо!

ответ

2

появляются только файлы имеют .directory свойство, каталоги нет, так что вы никогда не получите что-то, что передает ваш (.directory соответствует шаблону), а также передает ваш (PSIsContainer) фильтр.

Кроме того, что ваш PSIsContainer фильтр не работает:

| ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name } 

это не имеет смысла; вы можете только фильтровать конвейер, используя ? с cmdlet | ? {}, вы не можете фильтровать в начале цикла скриптов без ввода и получить что-нибудь полезное. Это работает where-object {} снова и снова в цикле, и он не имеет выхода.

Использование -Recurse будет очень медленным, поскольку вы переходите в каждую директорию до конца и создаете объекты [fileinfo] для всех файлов.

Помимо подстановочного ответа Мэтты, предполагая PS v3 или выше, вы можете перечислить все каталоги в корне, а затем все каталоги внутри тех, и останавливаться на достигнутом:

Get-ChildItem c:\ -Directory | Get-ChildItem -Directory | Select -ExpandProperty Name 

or 

gci c:\ -Dir | ForEach { (gci $_ -Dir).Name } 
+0

Здравствуйте! Я пытался с '-Directory', и он работает. Спасибо за помощь! На самом деле, я также попытался использовать 'ForEach-Object {? {$ _. PSIsContainer} | Select-Object Name' после инструкции '-Directory', и она работает. Очевидно, что 'Select Name' лучше. Но ... просто чтобы вы знали. Спасибо! – Hari

+0

@ Хари Это работает? Я пытаюсь gci | для каждого { ? {$ _. PsIsContainer}} 'и нет выхода - нет файлов, нет папок. '$ _' не имеет значения ...? – TessellatingHeckler

+0

Я пробовал эту команду: 'Get-ChildItem C: \ * \ * -Directory | ? {$ _. PSIsContainer} | Выберите -ExpandProperty Name', и он дает мне тот же результат: 'Get-ChildItem c: \ -Directory | Get-ChildItem -Directory | Выберите -ExpandProperty Name'. Итак ... да, это работает. – Hari

1

Вы должны просто использовать некоторые забавные шаблоны, чтобы получить то, что вы хотите здесь.

Get-ChildItem \*\*\ | Where-Object{$_.PSIsContainer} 

Или если у вас есть по крайней мере PowerShell 3.0 это будет быстрее

Get-ChildItem \*\*\ -Directory 

Тогда, если вы хотите только имена лавировать на | Select-Object -ExpandProperty Name

Смежные вопросы