Reputation: 3
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
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