Home > other >  How to move items excluding certain folder using PowerShell?
How to move items excluding certain folder using PowerShell?

Time:04-15

The question is an oversimplification of the real issue.

I have a folder let's call it "ParentFolder". Within this folder are files and subfolders. I want all the files and subfolders moved from the "ParentFolder" except one specific subfolder, let's call it "SpecificChildFolder". For the "SpecificChildFolder" I don't want the folder to be moved but only the files in it.

I can do these two tasks separately. I can either move all the files and folders(including the "SpecificChildFolder) in the "ParentFolder" or I can move files from the "SpecificChildFolder" only (excluding the rest of the files and subfolders in the "ParentFolder").

I want these two tasks to happen simultaneously.

I thought I would accomplish this in two separate functions:

  1. Move everything except "SpecificChildFolder"
  2. Move files from within the "SpecificChildFolder"

The stage# 2 code works. It is Stage# 1 I have issues with. I have also tried Get-ChildItem $src -ErrorAction SilentlyContinue | Where-Object {$_.Directory.Name -NotLike "*SpecificChildFolder*"} | ForEach-Object{} but this doesn't work either

Secondly, can this is not happen in one line of PowerShell?

I am using PowerShell Core 7.2

Code for Stage 1:

#Sources 
$src = "C:\User\Desktop\TEST\ParentFolder\*"
$srcMcaNameChg = "C:\User\Desktop\TEST\ParentFolder"
#Destination 
$dest = "C:\Users\harguls\Desktop\TEST\DestinationFolder"

Function MoveFiles{
    Param(
        [string]$src,
        [string]$dest,
        [string]$srcNameChange
    )
   Get-ChildItem $src -Recurse -Exclude 'SpecificChildFolder' -ErrorAction SilentlyContinue | ForEach-Object{
        $fileName = $_.Name
        # Check for duplicate files
        $file = Test-Path -Path $dest\$fileName
        Write-Output $file
        if($file)
        {
        "$srcNameChange\$fileName" | Rename-Item -NewName ("Copy_" $fileName)      
        }   
    }
    Move-Item -Path $src  -Destination $dest -Force
} 
MoveFiles -src $src -dest $dest -srcNameChange $srcMcaNameChg

CodePudding user response:

Here is a vague representation of what it seems you're looking to accomplish, hope the inline comments are explanatory.

$source = '\path\to\source\folder'
$destination = '\path\to\destination\folder'
# you can add multiple folders here if you want
$exceptWith = 'foldertoexclude1', 'foldertoexclude2'

# get only the subfolders of `$source` and iterate over them
Get-ChildItem $source -Directory | ForEach-Object {
    # if this folder name is in the folders to exclude array
    if($_.Name -in $exceptWith) {
        # get only the files of this folder and move them to destination
        Get-ChildItem $exclude -File | Move-Item -Destination $destination
        # if we're here we can proceed with next subfolder
        return
    }
    # if we're here means that the name of the folder was not in `$exceptWith`
    # so we move this folder and all it's child folders / files
    Move-Item -LiteralPath $_.FullName -Destination $destination -Recurse
}
  • Related