J donmks
J donmks

Reputation: 3

Can't find better solution with loops

I have a task in PowerShell that checks the name of the file and if it exists add number at the end and if it exists after first check we will increase number by one.

I have trouble with increasing number by 1.

$path = 'D:\Test\TestFile.zip'

if (Test-Path $path) {
    # File exists, append number
    $fileSeed = 0
    do {
        $path = $path  -replace ".zip$"
        $path += ''
        $fileSeed++
        $path = "$path$fileSeed.zip"
    } until ( ! (Test-Path $path) )
} else {
    $path
}

Upvotes: 0

Views: 44

Answers (1)

Theo
Theo

Reputation: 61068

Some time ago, I've written a small function for that called Get-UniqueFileName.

function Get-UniqueFileName {
    [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Mandatory = $true, Position = 0)]
        [Alias('FullName')]
        [string]$Path
    )

    $directory = [System.IO.Path]::GetDirectoryName($Path)
    $baseName  = [System.IO.Path]::GetFileNameWithoutExtension($Path)
    $extension = [System.IO.Path]::GetExtension($Path)    # this includes the dot
    # get an array of all files with the same extension currently in the directory
    $allFiles  = @(Get-ChildItem $directory -File -Filter "$baseName*$extension" | Select-Object -ExpandProperty Name)

    # construct the possible new file name (just the name, not hte full path and name)
    $newFile = $baseName + $extension
    $seed = 1
    while ($allFiles -contains $newFile) {
        # add the seed value between brackets. (you can ofcourse leave them out if you like)
        $newFile = "{0}({1}){2}" -f $baseName, $seed, $extension
        $seed++
    }
    # return the full path and filename
    return Join-Path -Path $directory -ChildPath $newFile
}

Use it like this:

Get-UniqueFileName -Path 'D:\Test\TestFile.zip'

If directory D:\Test already contained a file named TestFile.zip and another file named TestFile(1).zip, it will return D:\Test\TestFile(2).zip

Upvotes: 1

Related Questions