Cortez Ninja
Cortez Ninja

Reputation: 89

Powershell not excluding specific sub folders when use copy-item command

I'm bit new dumb in PS. I've gone through very much all questions logged here and tried my level best to work for me, but unfortunately didn't work for me as I want to.

I'm trying to copy the whole folder structure apart of excluding some. For e.g I want to copy whole c:\Program Files\myTest to Destination C:\Program Files\TargetTest except (exclude below folders) c:\Program Files\myTest\_Backup and c:\Program Files\myTest\Processor\Reports

     $SourceFolder = "$env:ProgramFiles\myTest\"
     $ReportExclude="$env:ProgramFiles\myTest\Processor\Reports\*.rdl"
     $TargetFolder = "$env:ProgramFiles\TargetTest"
     $BackupRootFolderName = "_Backup"
     $BackupRootFolderPath = "$TargetFolder\$BackupRootFolderName"
     $BackupFolderPath = "$BackupRootFolderPath\$(Get-Date -format yyyyMMdd_HHmmss)"

      Get-Item -Path $SourceFolder\* -Exclude $ReportExclude, _Backup| %  { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder -recurse}

When I run above code it copies everything and exclude the only _Backup but copy the Reports folder/files anyway, which I don't want to be copied.

Could someone please look into this and point me out what I'm doing wrong.

Thank you very much

Upvotes: 0

Views: 741

Answers (2)

freakydinde
freakydinde

Reputation: 1130

solution was not that easy, the -Exclude switch exclude folder but not sub items, the -Filter switch use wildcard but take a single string as parameters.. (by the way @whatever was right when he said the -recurse switch on Copy-Item cancel your exclusion on Get-ChildItems)

finally i solved it in a dirty but working way :

Get-ChildItem -Path $SourceFolder -Recurse | ? { $_.FullName -notlike $ReportExclude -and $_.FullName -notlike $BackupRootFolderName } | % { write-host $_.FullName; Copy-Item -Path $_.FullName -Destination $($_.FullName -replace $SourceFolder, $TargetFolder) -Force} 

Edit, because i don't understand what is not working in your configuration, let's test a full script with loggin :

$SourceFolder = "$env:ProgramFiles\myTest\" 
$ReportExclude = "$env:ProgramFiles\myTest\Processor\Reports\*.rdl" 
$TargetFolder = "$env:ProgramFiles\TargetTest" 

$BackupRootFolderName = "_Backup" 
$BackupRootFolderPath = "$TargetFolder\$BackupRootFolderName" 
$BackupFolderPath = "$BackupRootFolderPath\$(Get-Date -format yyyyMMdd_HHmmss)" 

$ErrorActionPreference = "Continue"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"

Function Copy-MyFiles($FileFullNameSource)
{
    try
    {
        Write-Verbose "file source : $FileFullNameSource"

        if ($FileFullNameSource -notlike $ReportExclude -and $FileFullName -notlike $BackupRootFolderName)
        {
            $FileFullNameDestination = $FileFullNameSource -replace $SourceFolder, $TargetFolder

            Write-Verbose "file destination : $FileFullNameDestination"

            Copy-Item -Path $FileFullNameSource -Destination $FileFullNameDestination -Force

            if (Test-Path $FileFullNameDestination)
            {
                Write-Host "$FileFullNameDestination ok" -ForegroundColor Green
            }
            else
            {
                Write-Warning "$FileFullNameDestination is missing in destination folder"
            }
        }
        else
        {
            Write-Host "$FileFullNameSource is excluded"
        }
    }
    catch
    {
        Write-Warning ($_.Exception | Select-Object -Property Message |  Out-String)
    }
}

Write-Verbose "source folder : $SourceFolder"
Write-Verbose "target folder : $TargetFolder"

Get-ChildItem -Path $SourceFolder -Recurse | % { Copy-MyFiles $_.FullName }

Upvotes: 0

whatever
whatever

Reputation: 891

Your Problem is the -recurse switch in the copy-item statement. Get-Item will give that command the folder "$env:ProgramFiles\myTest\",

Copy-Item -Recurse

will then copy that folder including all subfolders. Try this:

Get-ChildItem -Path $SourceFolder\* -Exclude $ReportExclude, _Backup -Recurse | %  { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder} 

This should generate a list of all folders and files first (including subfolders), ignoring the ones you want excluded, and then copy each of them to the target destination.
dang. Will check for a proper solution once I have the time.

Upvotes: 0

Related Questions