cnjfo672
cnjfo672

Reputation: 45

Powershell script to create a single folder based of the 5 digits in the name of the pdf's

So far I have tried the following script:


    $SourceFolder = "D:\WORK\JetLetter\LKY\LKY_jV_004\"
    $TargetFolder = "D:\WORK\JetLetter\LKY\LKY_jV_004\Final\"
    Get-ChildItem -Path $SourceFolder -Filter *.pdf |
    ForEach-Object {
            $ChildPath = Join-Path -Path $_.Name.Replace('.pdf','') -ChildPath $_.Name
            [System.IO.FileInfo]$Destination = Join-Path -Path $TargetFolder -ChildPath $ChildPath
            if( -not ( Test-Path -Path $Destination.Directory.FullName )){
                New-Item -ItemType Directory -Path $Destination.Directory.FullName
                }
            Copy-Item -Path $_.FullName -Destination $Destination.FullName
    }

This creates a folder for every pdf in the folder. I need it create a single folder based on the 5 digit in the name and move those files into the new folder.

For example: I could have 10 pdf's that have the number "30565" in them and the new folder should be named "30565"

Here are some file names to explain:

    LKY_20974_Pr01_1-5000.pdf
    to
    D:\WORK\JetLetter\LKY\LKY_jV_004\Final\20974

    LKY_20974_Pr02_5001-10000.pdf
    to
    D:\WORK\JetLetter\LKY\LKY_jV_004\Final\20974

    LKY_20974_Pr03_10001-15000.pdf
    to
    D:\WORK\JetLetter\LKY\LKY_jV_004\Final\20974

I have tried to include an else block to the best answer script and haven't had much success. I did however create a separate script that will archive the files before creating a new file. I just have to run it before the main powershell script.

$SourceDir = 'D:\WORK\JetLetter\LKY\LKY_jV_004_9835'
$DestDir = 'D:\WORK\JetLetter\LKY\#Print_Production_Files'
$ArchiveDir = 'D:\WORK\JetLetter\LKY\#Print_Production_Files\@archive'
$Filter = '*.pdf'

$FileList = Get-ChildItem -LiteralPath $SourceDir -Filter $Filter -File

foreach ($FL_Item in $FileList)
{
    # this presumes the target dir number is ALWAYS the 2nd item in the split string
    $TargetDir = $FL_Item.BaseName.Split('_')[1]
    $FullTargetDir = Join-Path -Path $DestDir -ChildPath $TargetDir
    if (Test-Path -LiteralPath $FullTargetDir)
    {
        # the "$Null =" is to suppress unwanted output about what was done
        $null = Move-Item -Path $FullTargetDir -Destination $ArchiveDir -Force
    }
}

This has made the files and folders a lot more organized.

Upvotes: 1

Views: 159

Answers (1)

Lee_Dailey
Lee_Dailey

Reputation: 7479

i think this does what you want done. [grin] the comments seem adequate, but if you have any questions, please ask.

$SourceDir = 'c:\temp\JetLetter\LKY\LKY_jv_004'
$DestDir = 'c:\temp\JetLetter\LKY\LKY_jv_004\Final'
$Filter = '*.pdf'

#region >>> make the dirs and sample files to work with
#    remove the entire "#region/#endregion" block when you are ready to work with real data
# make the dirs
$Null = mkdir -Path $SourceDir, $DestDir -ErrorAction 'SilentlyContinue'

# make the test files
$SampleFiles = @(
    'LKY_11111_Pr11_1-11111.pdf'
    'LKY_22222_Pr22_2-22222.pdf'
    'LKY_22222_Pr22_2222-2222.pdf'
    'LKY_33333_Pr33_3-3333.pdf'
    'LKY_33333_Pr33_33333-33333.pdf'
    'LKY_55555_Pr55_5-5555.pdf'
    'LKY_77777_Pr77_7-77777.pdf'
    'LKY_77777_Pr77_77777-77777.pdf'
    'LKY_99999_Pr99_9-99999.pdf'
    )

foreach ($SF_Item in $SampleFiles)
    {
    # the "$Null =" is to suppress unwanted output about what was done
    $Null = New-Item -Path $SourceDir -Name $SF_Item -ItemType 'File' -ErrorAction 'SilentlyContinue'
    }
#endregion >>> make the dirs and sample files to work with


$FileList = Get-ChildItem -LiteralPath $SourceDir -Filter $Filter -File

foreach ($FL_Item in $FileList)
    {
    # this presumes the target dir number is ALWAYS the 2nd item in the split string
    $TargetDir = $FL_Item.BaseName.Split('_')[1]
    $FullTargetDir = Join-Path -Path $DestDir -ChildPath $TargetDir
    if (-not (Test-Path -LiteralPath $FullTargetDir))
        {
        # the "$Null =" is to suppress unwanted output about what was done
        $Null = New-Item -Path $FullTargetDir -ItemType 'Directory'
        }

    $NewFullFileName = Join-Path -Path $FullTargetDir -ChildPath $FL_Item.Name
    # leave the file in the source dir if it already is in the final target dir
    #    you may want to save the not-copied info to a file for later review
    if (-not (Test-Path -LiteralPath $NewFullFileName))
        {
        # the "Move-Item" cmdlet on win7ps5.1 is wildly unreliable
        #    so i used copy & then remove
        $Null = Copy-Item -LiteralPath $FL_Item.FullName -Destination $NewFullFileName
        Remove-Item -LiteralPath $FL_Item.FullName
        }
        else
        {
        Write-Warning ('    {0} already exists in {1}' -f $FL_Item.Name, $FullTargetDir)
        Write-Warning '        The file was not moved.'
        Write-Warning ''
        }
    }

screen output only exists for "not moved" files. again, you may want to save the list to a $Var or to a file for later work.

one of the moved files ...

C:\Temp\JetLetter\LKY\LKY_jv_004\Final\22222\LKY_22222_Pr22_2222-2222.pdf

Upvotes: 1

Related Questions