Подтвердить что ты не робот

Копирование файлов элементов в папки и подпапки в одной структуре каталогов исходного сервера с использованием PowerShell

Я изо всех сил стараюсь сделать это ниже script, чтобы скопировать файлы в папки и подпапки в правильной структуре (как исходный сервер).

Скажем, есть папки, упомянутые ниже:

Основная папка: Файл aaa, Файл bbb

Подпапка a: Файл 1, Файл 2, Файл 3

Подпапка b: Файл 4, Файл 5, Файл 6

Script используется:

Get-ChildItem -Path \\Server1\Test -recurse | ForEach-Object {
Copy-Item -LiteralPath $_.FullName -Destination \\server2\test |
Get-Acl -Path $_.FullName | Set-Acl -Path "\\server2\test\$(Split-Path -Path $_.FullName -Leaf)"

}

Вывод: Файл aaa, Файл bbb

Подпапка a (Пустая папка)

Подпапка b (Пустая папка)

Файл 1, файл 2, файл 3, файл 4, файл 5, файл 6.

Я хочу, чтобы файлы копировались в соответствующие папки (например, исходные папки). Любая дополнительная помощь высоко ценится.

4b9b3361

Ответ 1

Это можно сделать только с помощью Copy-Item. Не нужно использовать Get-Childitem. Я думаю, вы просто переусердствовали.

Copy-Item -Path C:\MyFolder -Destination \\Server\MyFolder -recurse -Force

Я только что протестировал его, и это сработало для меня.

Ответ 2

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

# Find the source files
$sourceDir="X:\sourceFolder"

# Set the target file
$targetDir="Y:\Destfolder\"
Get-ChildItem $sourceDir -Include *.* -Recurse |  foreach {

    # Remove the original  root folder
    $split = $_.Fullname  -split '\\'
    $DestFile =  $split[1..($split.Length - 1)] -join '\' 

    # Build the new  destination file path
    $DestFile = $targetDir+$DestFile

    # Move-Item won't  create the folder structure so we have to 
    # create a blank file  and then overwrite it
    $null = New-Item -Path  $DestFile -Type File -Force
    Move-Item -Path  $_.FullName -Destination $DestFile -Force
}

Ответ 3

Если вы хотите зеркалировать один и тот же контент из источника в пункт назначения, попробуйте выполнить его.

function CopyFilesToFolder ($fromFolder, $toFolder) {
    $childItems = Get-ChildItem $fromFolder
    $childItems | ForEach-Object {
         Copy-Item -Path $_.FullName -Destination $toFolder -Recurse -Force
    }
}

Тест:

CopyFilesToFolder "C:\temp\q" "c:\temp\w"

Ответ 4

У меня были проблемы с самым популярным ответом (переосмысление). Это поместило AFolder в \Server\MyFolder\AFolder, и я хотел содержимое AFolder и ниже в MyFolder. Это не сработало.

Copy-Item -Verbose -Path C:\MyFolder\AFolder -Destination \\Server\MyFolder -recurse -Force

Плюс мне нужно было фильтровать и копировать только файлы *.config.

Это не сработало, с "\ *", потому что не вернулось

Copy-Item -Verbose -Path C:\MyFolder\AFolder\* -Filter *.config -Destination \\Server\MyFolder -recurse -Force

Я закончил тем, что отрезал начало строки пути, чтобы получить childPath относительно того, откуда я возвращался. Это работает для рассматриваемого варианта использования и переместилось во многие подкаталоги, чего нет в некоторых других решениях.

Get-Childitem -Path "$($sourcePath)/**/*.config" -Recurse | 
ForEach-Object {
  $childPath = "$_".substring($sourcePath.length+1)
  $dest = "$($destPath)\$($childPath)" #this puts a \ between dest and child path
  Copy-Item -Verbose -Path $_ -Destination $dest -Force   
}

Ответ 5

Я хотел найти решение для копирования файлов, измененных после определенных дат и времени, которые мне не нужны, чтобы использовать Get-ChildItem через фильтр. Ниже я придумал:

$SourceFolder = "C:\Users\RCoode\Documents\Visual Studio 2010\Projects\MyProject"
$ArchiveFolder = "J:\Temp\Robin\Deploy\MyProject"
$ChangesStarted = New-Object System.DateTime(2013,10,16,11,0,0)
$IncludeFiles = ("*.vb","*.cs","*.aspx","*.js","*.css")

Get-ChildItem $SourceFolder -Recurse -Include $IncludeFiles | Where-Object {$_.LastWriteTime -gt $ChangesStarted} | ForEach-Object {
    $PathArray = $_.FullName.Replace($SourceFolder,"").ToString().Split('\') 

    $Folder = $ArchiveFolder

    for ($i=1; $i -lt $PathArray.length-1; $i++) {
        $Folder += "\" + $PathArray[$i]
        if (!(Test-Path $Folder)) {
            New-Item -ItemType directory -Path $Folder
        }
    }   
    $NewPath = Join-Path $ArchiveFolder $_.FullName.Replace($SourceFolder,"")

    Copy-Item $_.FullName -Destination $NewPath  
}