Jim
Jim

Reputation: 16002

Copy directory structure with PowerShell

Is there a way of doing the following in PowerShell?

xcopy \\m1\C$\Online\*.config \\m2\C$\Config-Backup /s

I have tried this:

Copy-Item \\m1\C$\Online\* -Recurse -Destination \\m2\C$\Config-Backup -include *.config

But it does nothing, probably because there are no configuration files in the root. How do I do it?

Upvotes: 2

Views: 3943

Answers (4)

G boot
G boot

Reputation: 11

Look into robocopy. It's not a native PowerShell command, but I call it from PowerShell scripts all the time. Works similarly to xcopy only it's way more powerful.

Upvotes: 0

Shogun
Shogun

Reputation: 11

The new AlphaFS 2.0 makes this really easy.

Example: Copy a directory recursively

# Set copy options.
PS C:\> $copyOptions = [Alphaleonis.Win32.Filesystem.CopyOptions]::FailIfExists

# Set source and destination directories.
PS C:\> $source = 'C:\sourceDir'
PS C:\> $destination = 'C:\destinationDir'

# Copy directory recursively.
PS C:\> [Alphaleonis.Win32.Filesystem.Directory]::Copy($source, $destination, $copyOptions)

AlphaFS on GitHub

Upvotes: 0

Rhys Paterson
Rhys Paterson

Reputation: 73

If you would like to use native PowerShell (with a third party .NET module :P) and also don't want to let long file paths (> 255 characters) halt the copy, you can use this:

# Import AlphaFS .NET module - http://alphafs.codeplex.com/
Import-Module C:\Path\To\AlphaFS\DLL\AlphaFS.dll

# Variables
$SourcePath = "C:\Temp"
$DestPath = "C:\Test"

# RecursePath function.
Function RecursePath([string]$SourcePath, [string]$DestPath){

    # for each subdirectory in the current directory..       
    [Alphaleonis.Win32.Filesystem.Directory]::GetDirectories($SourcePath) | % {

        $ShortDirectory = $_
        $LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($ShortDirectory)

        # Create the directory on the destination path.
        [Alphaleonis.Win32.Filesystem.Directory]::CreateDirectory($LongDirectory.Replace($SourcePath, $DestPath))

        # For each file in the current directory..                                              
        [Alphaleonis.Win32.Filesystem.Directory]::GetFiles($ShortDirectory) | % {

            $ShortFile = $_
            $LongFile = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($ShortFile)

            # Copy the file to the destination path.                                                                       
            [Alphaleonis.Win32.Filesystem.File]::Copy($LongFile, $LongFile.Replace($SourcePath, $DestPath), $true)                             

        }

    # Loop.
    RecursePath $ShortDirectory $DestPath
    }
}

# Execute!
RecursePath $SourcePath $DestPath

Please note this code was stripped out of a much larger project of mine, but I gave it a quick test and it seems to work. Hope this helps!

Upvotes: 2

Scott
Scott

Reputation: 999

Start-Process xcopy "\\m1\C$\Online\*.config \\m2\C$\Config-Backup /s" -NoNewWindow

:P

Upvotes: 1

Related Questions