Windows – Copy all files with a certain name using Powershell

powershellwindows

I'd like to find and copy all the files in a certain directory and all it's sub-directories with a particular name.

I'm using Copy-Item in Powershell (technet | ss64)

Here's what I have:

Copy-Item `
    -Path \\Server\Apps\* `
    -Destination C:\ReadMeFiles\ `
    -Include *ReadMe.txt `
    -Recurse `
    -WhatIf

It will grab the following file:

\\Server\Apps\ReadMe.txt

But not:

\\Server\Apps\AppName\ReadMe.txt

Even though I've specified -recurse

How can I get it to travel down in each directory?

Best Answer

My slightly modified answer from this question: Batch File:List all files of a type, rename files, flatten the directory

It does what you want: copies files using wildcard, flattens directory structure, handles filename conflicts. It uses Get-ChildItem, as Tᴇcʜιᴇ007 suggested.

# Setup source and destination paths
$Src = '\\Server\Apps'
$Dst = 'C:\ReadMeFiles'

# Wildcard for filter
$Extension = '*ReadMe.txt'

# Get file objects recursively
Get-ChildItem -Path $Src -Filter $Extension -Recurse |
    # Skip directories, because XXXReadMe.txt is a valid directory name
    Where-Object {!$_.PsIsContainer} |
        # For each file
        ForEach-Object {

            # If file exist in destination folder, rename it with directory tag
            if(Test-Path -Path (Join-Path -Path $Dst -ChildPath $_.Name))
            {
                # Get full path to the file without drive letter and replace `\` with '-'
                # [regex]::Escape is needed because -replace uses regex, so we should escape '\'
                $NameWithDirTag = (Split-Path -Path $_.FullName -NoQualifier)  -replace [regex]::Escape('\'), '-'

                # Join new file name with destination directory
                $NewPath = Join-Path -Path $Dst -ChildPath $NameWithDirTag
            }
            # Don't modify new file path, if file doesn't exist in target dir
            else
            {
                $NewPath = $Dst
            }

            # Copy file
            Copy-Item -Path $_.FullName -Destination $NewPath
        }
Related Question