Вывод ТОЛЬКО папок и исключение определенных

У меня есть база данных с более чем 10 ТБ данных, и мне нужно организовать данные. Я делаю это, используя Powershell для вывода только папок в текстовый файл, а затем импортирую их в Excel для дальнейшей обработки. Мне ТОЛЬКО нужны папки и подпапки, например, диска Z. Я не хочу никаких файлов. Я сталкиваюсь с проблемой, когда пытаюсь исключить определенные папки и все вложенные в них папки.

Скажем, например, имена папок и их содержимое, которые я хочу исключить, — «BackScatter» и «MicroData». Я использую этот скрипт:

dir -recurse -Exclude "Backscatter","MicroData" | Where-Object { $_.PSIsContainer } | ForEach-Object { $_.FullName } > ZDrive.txt

Я не получаю сообщение об ошибке, оно просто не исключает эти папки, когда выполняет рекурсию.

Также мне было интересно, могу ли я просто исключить подпапки в «Backscatter», а не всю папку. Я много искал на сайте, но я настолько новичок, что не могу понять ни один из сценариев, отвечающих на вопрос.


person Joseph Greca    schedule 01.04.2013    source источник


Ответы (4)


Get-Help Get-ChildItem -Full

Я использую PS 3.0, похоже, есть переключатель -File и -Directory, который можно использовать вместо ? {$_.psiscontainer}. При работе с большими данными используйте Foreach-Object % быстрее, чем Where-Object. Что касается того, что -Exclude не работает, я не уверен. Вы всегда можете использовать regex и оператор -match.

Get-ChildItem $path -r -Directory | % {if($_.name -notmatch 'BackScatter|MicroData'){$_.fullname}}
person E.V.I.L.    schedule 01.04.2013

Ну, это, вероятно, исключает 2 папки, о которых вы сказали, но не подпапки из-за рекурсии.

Можно попробовать постобработку. Как добавление | ? {$_ -notmatch 'Backscatter|MicroData'}

person Adil Hindistan    schedule 01.04.2013
comment
Большое спасибо, добрый господин. Ваши дополнения постобработки сработали. - person Joseph Greca; 01.04.2013
comment
Кстати, я предполагаю, что вы не используете Powershell 3.0, в котором есть опция (каталог), позволяющая выбирать только каталоги. Таким образом, вы получите что-то вроде: (dir -recurse -directory).fullname | ? {$_ -notmatch 'Backscatter|MicroData'} - person Adil Hindistan; 02.04.2013

Это работает для вас?

(dir -recurse | Where-Object { $_.PSIsContainer } | ForEach-Object { $_.FullName }) -notmatch '\\(BackScatter|MicroData)\\' > ZDrive.txt
person mjolinor    schedule 01.04.2013
comment
ДА !! Это большое спасибо. Вы спасли одного человека от многих часов разочарования. - person Joseph Greca; 01.04.2013

Попробуй это:

$excludes = @("BackScatter", "MicroData")

dir -recurse | ? {
  $_.PSIsContainer -and $excludes -notcontains $_.Name
} | % { $_.FullName } > ZDrive.txt
person Ansgar Wiechers    schedule 01.04.2013