Копирование содержимого папки с сохранением структуры папки с использованием сценария powershell - PullRequest
0 голосов
/ 14 января 2019

У меня есть структура исходных папок, как показано ниже

c:\TestResults
|-- Log
|   |-- xyz.pdf
|   `-- Reports
|       `-- rp.pdf
|-- Keywords
|   |-- key.txt
|   |   `-- pb.ea
|   `-- reports
|-- Test
|   |-- 11.pdf
|   |-- 12
|   `-- Log
|       |-- h1.pdf
|       `-- Reports
|           `-- h2.pdf
`-- Dev
    |-- st
    |-- ea
    `-- Log
        `-- Reports
            `-- h4.pdf

Мне нужно скопировать все папки «Log», сохраняя структуру папок. Путь назначения: «c: \ Work \ Logs \ TestResults». Результирующая структура должна быть такой, как показано ниже.

c:\Work\Logs\TestResults
|-- Log
|   |-- xyz.pdf
|   `-- Reports
|       `-- rp.pdf
|-- Test
|   `-- Log
|       |-- h1.pdf
|       `-- Reports
|           `-- h2.pdf
`-- Dev
    `-- Log
        `-- Reports
            `-- h4.pdf

Есть ли простой способ добиться этого с помощью сценария powershell? Спасибо!

Редактировать: Вот код, который я написал до сих пор. Это выравнивает структуру папок, но не поддерживает иерархию. Я новичок в скриптах PowerShell. Пожалуйста, помогите.

$baseDir = "c:\TestResults"
$outputDir = "c:\Work\Logs"
$outputLogsDir = $outputDir + "\TestResults"
$nameToFind = "Log"

$paths = Get-ChildItem $baseDir -Recurse | Where-Object { $_.PSIsContainer -and $_.Name.EndsWith($nameToFind)}

if(!(test-path $outputLogsDir))
{
   New-Item -ItemType Directory -Force -Path $outputLogsDir
}


foreach($path in $paths)
{
   $sourcePath = $path.FullName + "\*"   
   Get-ChildItem -Path $sourcePath | Copy-Item -Destination $outputLogsDir -Recurse -Container
}                 

1 Ответ

0 голосов
/ 14 января 2019

То, что вы после, как показано ниже. он скопирует элемент и каталог, если в какой-либо его части есть «\ log».

$gci = Get-ChildItem -Path "C:\TestResults" -Recurse

Foreach($item in $gci){
    If($item.FullName -like "*\log*"){
        Copy-Item -Path $item.FullName -Destination $($item.FullName.Replace("C:\TestResults","C:\Work\Logs\TestResults")) -Force
    }
}
...