用循环找不到更好的解决方案

时间:2019-01-15 13:35:36

标签: powershell loops

PowerShell中有一个任务,它检查文件名,如果文件名末尾有添加号,并且如果在第一次检查后存在,我们将数字加一。

我很难将数字增加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
}

1 个答案:

答案 0 :(得分:1)

前一段时间,我已经为那个叫做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
}

像这样使用它:

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

如果目录D:\Test已经包含一个名为TestFile.zip的文件和另一个名为TestFile(1).zip的文件,它将返回D:\Test\TestFile(2).zip