Как рекурсивно найти все папки, содержащие папку .hg в PowerShell - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь написать скрипт в PowerShell для резервного копирования нашей коллекции хранилищ Mercurial.

Я начал с этого:

$repos=Get-ChildItem C:\hgrepos|Where-Object { $_.PSIsContainer }

Это позволит получить первый уровень папок в C: \ hgrepos, что обычно хорошо, так как именно здесь находятся наши репозитории. Тем не менее, субпозитории существуют. Так что мне нужно идти рекурсивно. И самое главное, должны быть перечислены только папки, содержащие подпапку .hg .

Ответы [ 3 ]

7 голосов
/ 01 февраля 2012

Вы можете использовать флаг -recurse в Get-ChildItem

Это будет примерно так:

gci c:\hgrepos -recurse -include ".hg" | %{$_.Parent}
1 голос
/ 01 февраля 2012

Я написал эту функцию PowerShell для резервного копирования наших репозиториев Mercurial:

function BackupHg
{
    param($repositoryRoot, $destination)

    # The path to the Hg executable
    $hg = """C:\Python26\hg.bat"""

    # Get the list of repos
    Get-ChildItem $repositoryRoot | 
        Where { $_.psIsContainer -eq $true } |
        ForEach -Process { 
            $repo = $_.FullName 
            $folder = $_.Name

            if (Test-Path "$repo\.hg") {
                $cmdLine = "$hg clone -U $repo $destination\$folder"
                cmd /c $cmdLine
            }
            else {
                New-Item "$destination\$folder" -type directory
                BackupHg "$repositoryRoot\$folder" "$destination\$folder"
            }
        }    
}

Вы передаете в корневую папку и место назначения резервной копии, и он находит все папки, проверяет, является ли это репозиторием Mercurial (ищет.hg directory) и клонирует репозиторий в место назначения резервной копии.Если папка не является репозиторием Mercurial, то она сама выполняет рекурсию.

Это сделано так, потому что мы используем папки для организации наших репо, поэтому весь код для каждого клиента находится в отдельной папке, отдельной от других клиентов.

Последний пункт.Наличие суб-репозиториев Mercurial не означает, что вам нужно рекурсировать.Если у вас нет репозитория с рабочей копией, ваш суб-репо не будет храниться в репозитории и должен быть заархивирован любой системой, в которой он хранится.Если это та же система, что и в репозитории, то это будет еще один репозиторий в вашей папке репозиториев, и для него будет выполнено резервное копирование с помощью приведенного выше сценария.

Например, у нас есть репозиторий WebApp с суб-репозиторием WebControls дляклиент и структура файла выглядят следующим образом:

C:\Repositories\Hg\Client\WebApp
C:\Repositories\Hg\Client\WebControls

WebControls не хранится в папке WebApp, даже если он является его вспомогательным хранилищем.

0 голосов
/ 02 февраля 2012

В итоге я использовал скрипт ниже.Спасибо Стиву Кейю и manojlds за столь необходимую обратную связь!

function BackupHg
{
    param($repositoryRoot, $destination)

    Remove-Item "$destination\*" -recurse

    # The path to the Hg executable
    $hg = """C:\Python27\Scripts\hg.bat"""

    # Get the list of repos
    Get-ChildItem $repositoryRoot -recurse | 
        Where { $_.psIsContainer -eq $true } |
        ForEach -Process { 
            $repo = $_.FullName 
            $folder = $_.FullName.Replace($repositoryRoot, $destination)


            if (Test-Path "$repo\.hg") {
                if (!(Test-Path "$folder")) {
                    New-Item "$folder" -type directory
                }
                $cmdLine = "$hg clone -U $repo $folder"
                write-host $cmdLine
                cmd /c $cmdLine
            }
        }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...