Powershell, Mass moving files of a certain type

16,766

Solution 1

A few things:

  1. You can pass the text you write to the screen directly to the read-host cmdlet, it saves you a line per user input.

  2. As a rule of thumb, if you plan to do more with an output of a command, DO NOT pipe it to the format-* cmdlets. The format cmdlets produces formatting objects that instructs powershell how to display the result on screen.

  3. Try to avoid assigning the result to a variable, if the result contains a large set of file system, memory consumption can go very high and you can suffer a performance degradation.

  4. Again, in terms of performance, try to use cmdlet parameters instead of the where-object cmdlet (server side filtering vs. client side). The first filters the objects on the target while the latter filters the objects only after the get to your machine.

The WhatIf switch will show you which files would have moved. Remove it to execute the command. You may also need to twick it to deal with duplicate file names.

$sourceDir = read-host "Please enter source Dir"
$format = read-host "Format to look for"

Get-ChildItem -Path $sourceDir -Filter $format -Recurse | Move-Item -Destination $sourceDir -Whatif

Solution 2

If I understood your question correctly, you can use Move-Item on files to move them to the output directory:

$Dir = get-childitem $sourceDir -recurse
$files = $Dir | where {$_.extension -eq "$format"}
$files | move-item -destination $outDir

Solution 3

A previous poster pointed out that the script would overwrite files of the same name. It might be possible to extend the script by a test and to avoid that possibility. Something like this:

$sourceDir = read-host "Please enter source Dir"
$format = read-host "Format to look for?"
$destDir = read-host "Please enter Destination Dir"

Get-ChildItem -Path $sourceDir -Filter $format -Recurse | Copy-Item   -Destination $DestDir 
$files = $DestDir | where {$_.extension -eq "$format"} 

If (Test-Path $files) {
    $i = 0
    While (Test-Path $DestinationFile) {
        $i += 1
        $DestinationFile = "$files$i.$format"
        Copy-Item -Destination $DestDir  $DestinationFile
    }
} 
Else {
    $DestinationFile = "$files$i.$format"
    Copy-Item -Destination $DestDir $DestinationFile
}
Copy-Item -Path $SourceFile -Destination $DestinationFile -Force
Share:
16,766
Craig Hendley
Author by

Craig Hendley

Updated on June 26, 2022

Comments

  • Craig Hendley
    Craig Hendley almost 2 years

    I want to make a script which will take a parent directory which has a number of child directories which have files in them. Using a listing I wish to move all of the files in the child directories in to the parent directory.

    I have created the following code so far which gives a listing of all the files of the specified type in the child directories but I am unsure how to a mass move of all the child files.

        Write-host "Please enter source Dir:"
    $sourceDir = read-host
    
    Write-Host "Format to look for with .  :"
    $format = read-host
    
    #Write-host "Please enter output Dir:"
    #$outDir = read-host
    
    $Dir = get-childitem -Path $sourceDir -Filter $format -recurse | format-table name
    
    $files = $Dir | where {$_.extension -eq "$format"} 
    $files #| format-table name
    
  • Craig Hendley
    Craig Hendley over 12 years
    thank you for the tips i will try and refine my approach in future and take on board what you have imparted. The powershell syntax appears to be very suited to some of the tasks I need to carry out so learning how to use it effectivly is high on my list of objectives