1

Powershell beginner here. I tried coding this using Powershell, but without getting anywhere.

I have a list of Wav files that I need to move automatically into a folder based on the file name.

20190822091227_202123545.wav

20190822080957_202123545.wav

The file name determines the folder structure - Example

2019(This is the Year)08(This is the Month)22(This is the Day)_202123545.wav

So the folder structure will be

C:\Archive\2019(Year)\201908(YearMonth)\22(Day)
C:\Archive\2019\201908\22 

and the wav files will move to that folder - In this case its 22

I have tried this code that I found here on Stackoverflow and added my own, but its giving me errors.

$SourceFolder = Set-Location "C:\CR\Files"
$targetFolder = "C:\Archive\CR_Dev\Test_Folder"
$numFiles = (Get-ChildItem -Path $SourceFolder -Filter *.WAV).Count
$i=0

clear-host;
Write-Host 'This script will copy ' $numFiles ' files from ' $SourceFolder ' to ' $targetFolder
Read-host -prompt 'Press enter to start copying the files'

$files = Get-ChildItem $SourceFolder | where {$_.extension -in ".wav"} | select -expand basename

 # Out FileName, year and month
    $Year = $files.Substring(0,4)
    $Month = $files.Substring(4,2)
    $Day = $files.Substring(6,2)

foreach ($file in $files)

{

    # Set Directory Path
    $Directory = $targetFolder + "\" + $Year+$Month + "\" + $Day

    # Create directory if it doesn't exsist
    if (!(Test-Path $Directory))
    {
    New-Item $Directory -type Directory
    }

    [int]$percent = $i / $numFiles * 100

    # Move File to new location
    $file | Copy-Item -Destination $Directory

    Write-Progress -Activity "Copying ... ($percent %)" -status $_  -PercentComplete $percent -verbose
    $i++
}

Write-Host 'Total number of files read from directory '$SourceFolder ' is ' $numFiles
Write-Host 'Total number of files that was copied to '$targetFolder ' is ' $i
Read-host -prompt "Press enter to complete..."
clear-host;

The files are not moving to the folder and I am getting error in the file names

Example

C:\Archive\2019 2019\2019 08 2019 08\22 22

1 Answer 1

2

$files is named appropriately plural as a variable that could contain many files. But when you go to retrieve the date parts, you use call it once, on the whole collection of files, instead of on each individual $file (which is the variable you have inside the loop which iterates over the collection of files).

So you want to set the date variables inside the loop, on every iteration, so that it's related to the current file.

$files = Get-ChildItem $SourceFolder | where {$_.extension -in ".wav"} | select -expand basename

foreach ($file in $files)
{
    $Year = $file.Substring(0,4)
    $Month = $file.Substring(4,2)
    $Day = $file.Substring(6,2)

   $Directory = $targetFolder + "\" + $Year+$Month + "\" + $Day

# etc
}

Also the pattern you laid out in your question doesn't seem to be what you're setting, so I'm a little confused how your output looks like it does.

What you have here:

$Directory = $targetFolder + "\" + $Year+$Month + "\" + $Day

Should produce: C:\Archive\201908\22 even though you want C:\Archive\2019\201908\22.

To produce what you wanted the line should be like this:

$Directory = $targetFolder + "\" + $Year + "\" + $Year+$Month + "\" + $Day

By the way you can use variables directly in double-quoted strings:

$Directory = "$targetFolder\$Year\$Year$Month\$Day"
Sign up to request clarification or add additional context in comments.

2 Comments

for the $directory variable, you can use join-path.
Thank you Briantist! Thank you! I can see what went wrong with $file. I have updated the $Directory code as well. Thank you again for pointing that out.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.