programing

PowerShell을 사용하여 원본 서버의 동일한 디렉터리 구조에 있는 폴더 및 하위 폴더의 복사 항목 파일

muds 2023. 8. 9. 21:07
반응형

PowerShell을 사용하여 원본 서버의 동일한 디렉터리 구조에 있는 폴더 및 하위 폴더의 복사 항목 파일

아래 스크립트가 폴더와 하위 폴더의 파일을 적절한 구조(소스 서버)로 복사하도록 하는 데 어려움을 겪고 있습니다.

아래에 언급된 폴더가 있다고 가정해 보겠습니다.

기본 폴더:파일 aaa, 파일 bbb

하위 폴더 a: 파일 1, 파일 2, 파일 3

하위 폴더 b: 파일 4, 파일 5, 파일 6

사용된 스크립트:

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)"

}

출력: File aaa, File bbb

하위 폴더 a(비어 있는 폴더)

하위 폴더 b(비어 있는 폴더)

파일 1, 파일 2, 파일 3, 파일 4, 파일 5, 파일 6.

파일을 각 폴더(예: 원본 폴더)에 복사합니다.더 이상의 도움을 주시면 대단히 감사하겠습니다.

이 작업은 Copy-Item을 사용하여 수행할 수 있습니다.Get-Child 항목을 사용할 필요가 없습니다.저는 당신이 그것을 너무 많이 생각하고 있다고 생각합니다.

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

방금 테스트해 봤는데 효과가 있었습니다.

편집: 댓글에 포함된 제안

# Add wildcard to source folder to ensure consistent behavior
Copy-Item -Path $sourceFolder\* -Destination $targetFolder -Recurse

원본에서 대상으로 동일한 콘텐츠를 미러링하려면 다음을 수행합니다.

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"

한번은 내가 이 스크립트, 이 복사 폴더 및 파일을 발견하고 동일한 소스 구조를 대상에 유지하면, 당신은 이것으로 몇 번 시도할 수 있습니다.

# 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
}

가장 인기 있는 답변에 어려움을 겪었습니다.\Server\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   
}

여기 있어요.


Function Backup-Files {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [System.IO.FileInfo[]]$Source,
        [Parameter(Mandatory)]
        [String]$Destination
    )

    if (!(Test-Path $Destination)) {[void][System.IO.Directory]::CreateDirectory($Destination)}

    ForEach ($File in $Source) {
        $SourceRoot = $(Convert-Path $File.PSParentPath).split('\')[0]
        $NewFile    = $($File.FullName).Replace($SourceRoot,$Destination)
        $NewDir     = $($File.DirectoryName).Replace($SourceRoot,$Destination)
        [void][System.IO.Directory]::CreateDirectory($NewDir)
        Copy-Item -Path $File.FullName -Destination $NewFile -Force
    }
}

<#
.SYNOPSIS
    Copy FileInfo object or array to a new destination while retaining the original directory structure.
.PARAMETER Source
    FileInfo object or array. (Get-Item/Get-ChildItem)
.PARAMETER Destination
    Path to backup source data to.
.NOTES
    Version (Date):             1.0 (2023-02-04)
    Author:                     Joshua Biddle (thebiddler@gmail.com)
    Purpose/Change:             Initial script development.
    Known Bugs:                 
.EXAMPLE
    Backup-Files -Source $(Get-ChildItem -Path 'C:\Users\*\Documents' -Recurse -Force -Exclude 'My Music','My Pictures','My Videos','desktop.ini' -ErrorAction SilentlyContinue) -Destination "C:\Temp\UserBackup"
.EXAMPLE
    Backup-Files -Source $(Get-ChildItem -Path 'C:\Users\*\Desktop' -Exclude "*.lnk","desktop.ini" -Recurse -Force -ErrorAction SilentlyContinue) -Destination "C:\Temp\UserBackup"
#>

특정 날짜와 시간이 지나면 수정된 파일을 복사할 수 있는 솔루션을 원했습니다. 즉, 필터를 통해 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  
}

언급URL : https://stackoverflow.com/questions/17842764/copy-item-files-in-folders-and-subfolders-in-the-same-directory-structure-of-sou

반응형