Andrew Hill
Andrew Hill

Reputation: 1

Powershell Copy-Item not keeping folder structure

I have the below script to copy data from a local folder to a remote folder created with the current date. However the files are copying but the folder structure is not.

$Date = (Get-Date).ToString("MMddyyyy"),$_.Extension
$Source = "E:\Folder1\\*"
$Dest   = "\\Server\Share\Folder2"
$Username = "Username"
$Password = ConvertTo-SecureString "Password" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential($Username, $Password)
Remove-PSDrive -Name T
Start-Sleep -s 1
New-PSDrive -Name T -PSProvider FileSystem -Root $Dest -Credential $mycreds -Persist
if (!(Test-Path "T:\$Date"))
{
    md -Path "T:\$Date"
}
Get-ChildItem -Path $Source -Recurse | % { Copy-Item -Path $_ -Destination "T:\$Date" -Container -Force -Verbose }

Could anyone advise where I am going wrong here?

Thank you.

Upvotes: 0

Views: 2469

Answers (2)

Adriano V.
Adriano V.

Reputation: 11

This question is a few years old, but in case someone arrives here like I did...

In another post, a user suggested using robocopy. It worked great for me:

robocopy "source/folder" "target/folder" "*.file_extension" /s

This command copies from the source folder the files that match the given filter, replicating the folder structure in the destination folder.

In this case, it would be used like:

robocopy "E:\Folder1\" "\\Server\Share\Folder2" "*" /s

Upvotes: 0

FoxDeploy
FoxDeploy

Reputation: 13537

Nice script, I think we can get this sorted in no time!

Why this happened

The reason this is failing is in this step right here:

  Get-ChildItem -Path $Source -Recurse  

The -Recurse switch is causing you pain. To illustrate why this is, I created a simple folder structure.

enter image description here

When you run Get-ChildItem -Path $Source -Recurse alone, you'll get a recursive listing of all files in the $Source path, like so:

PS C:\temp\stack> Get-ChildItem -Recurse

Directory: C:\temp\stack

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         8/4/2017  10:50 AM                Source


Directory: C:\temp\stack\Source    

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         8/4/2017  10:57 AM                1
d-----         8/4/2017  10:57 AM                2
d-----         8/4/2017  10:57 AM                3
d-----         8/4/2017  10:57 AM                4


Directory: C:\temp\stack\Source\1    

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         8/4/2017  10:57 AM             20 Archive.rar
-a----         8/4/2017  10:56 AM              0 File01.bmp

Well, in the next step of your script, you pipe that output over to Copy-Item for every single file.

You're basically expressly telling PowerShell 'take this folder and all of it's subfolders and everything, and dump them all in this one folder, ignoring the folder structure'

How to fix

What you really want to do is simply move the -Recurse parameter over to Copy-Item, and you're done :)

Get-ChildItem -Path $Source |  
    Copy-Item -Destination "T:\$Date" -Container -Recurse -Force -Verbose 

Hope that helps, have a nice 🎃day!

Upvotes: 1

Related Questions