2012-07-25 2 views
4

Используя следующий код Powershell, я пытаюсь найти папки, в которых не содержится robots.txt в корне. Как правило, я мог бы сделать это рекурсивно, но он принимает FOREVER, чтобы восстановить эту массивную структуру папок. Мне действительно нужен только первый уровень, AKA ищет только папки, найденные в C: \ Projects.Папки Powershell Return, которые содержат определенный файл, но не полностью рекурсивный

В принципе, мне нужно получить детей от каждого набора детей, и только потом вернуть родителей, где не было файла robots.txt. Проблема, с которой я столкнулась здесь, - это мой $ _ в вложенном цикле, который дает мне CWD, а не дочерние элементы каталога, который я ищу. Я знаю, что мне, возможно, придется использовать «Где-то здесь, но я немного над головой и довольно новый для powershell. Любая помощь приветствуется!

$drv = gci C:\Projects | %{ 
    $parent = $_; gci -exclude "robots.txt" | %{$_.parent}} | gu 

ответ

6

это один вкладыш (распространение через несколько для ясности) следует сделать трюк для вас:

# look directly in projects, not recursively 
dir c:\projects | where { 
    # returns true if $_ is a container (i.e. a folder) 
    $_.psiscontainer 
} | where { 
    # test for existence of a file called "robots.txt" 
    !(test-path (join-path $_.fullname "robots.txt")) 
} | foreach { 
    # do what you want to do here with $_ 
    "$($_.fullname) does not have robots.txt" 
} 
+0

Спасибо. Тестовый путь, хотя и не такой элегантный, как рекурсия дочерних каталогов, намного быстрее и легче читать. – Richthofen

+1

Вы считаете, что множественная рекурсия с помощью ограничителей глубины элегантна? В самом деле? :) – x0n

+0

Ну, я пытался сначала записать его в псевдокоде, и несколько рекурсий были самым простым способом «изобразить» то, что я хотел. Но, зная, что есть метод тестового пути, ну, я думаю, это значительно упрощает работу. – Richthofen

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