Copy-item Files in Folders and subfolders in the same directory structure of source server using PowerShell

前端 未结 5 1392
独厮守ぢ
独厮守ぢ 2021-02-05 02:20

I am struggling really hard to get this below script worked to copy the files in folders and sub folders in the proper structure (As the source server).

Lets say, there

相关标签:
5条回答
  • 2021-02-05 02:35

    This can be done just using Copy-Item. No need to use Get-Childitem. I think you are just overthinking it.

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

    I just tested it and it worked for me.

    edit: included suggestion from the comments

    # Add wildcard to source folder to ensure consistent behavior
    Copy-Item -Path $sourceFolder\* -Destination $targetFolder -Recurse
    
    0 讨论(0)
  • 2021-02-05 02:35

    I wanted a solution to copy files modified after a certain date and time which mean't I need to use Get-ChildItem piped through a filter. Below is what I came up with:

    $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  
    }
    
    0 讨论(0)
  • 2021-02-05 02:37

    one time i found this script, this copy folder and files and keep the same structure of the source in the destination, you can make some tries with this.

    # 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
    }
    
    0 讨论(0)
  • 2021-02-05 02:51

    If you want to mirror same content from source to destination, try following one.

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

    Test:

    CopyFilesToFolder "C:\temp\q" "c:\temp\w"
    
    0 讨论(0)
  • 2021-02-05 03:02

    I had trouble with the most popular answer (overthinking). It put AFolder in the \Server\MyFolder\AFolder and I wanted the contents of AFolder and below in MyFolder. This didn't work.

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

    Plus I needed to Filter and only copy *.config files.

    This didn't work, with "\*" because it did not recurse

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

    I ended up lopping off the beginning of the path string, to get the childPath relative to where I was recursing from. This works for the use-case in question and went down many subdirectories, which some other solutions do not.

    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   
    }
    
    0 讨论(0)
提交回复
热议问题