计算复制到文件夹中的文件的新版本

numerate new versions of a file copied into a folder

我有一个每天生成的文件。它是用文件名 dailyfile.dat.

生成的

需要将文件复制到目标文件夹中,并用比目标文件夹中已有文件大一位的个位数编号,以便所有文件共存且编号不存在间隙。

换句话说,我需要每天的副本为目标文件夹中已有的内容添加 +1。如果目标文件夹中存在 0,1 & 2,则放置在目标文件夹中的新副本应命名为 3,依此类推。如果不存在文件,它将被命名为 0.

像这样的东西应该可以工作:

$src       = 'c:\source\dailyfile.dat'
$dstFolder = 'c:\destination'

$f = Get-Item $src

$n = 0
do {
  $dst = Join-Path $dstFolder ($f.BaseName + $n + $f.Extension)
  $n++
} while (Test-Path -LiteralPath $dst)

Copy-Item $src $dst

添加到 Ansgar 的 post,如果您可以包含像 _ 这样的分隔符,那么您可以使用:

    $src       = 'c:\source\dailyfile.dat'
    $dstFolder = 'c:\destination'

    #Get the number from the last file in the destination directory
    [int]$NextNum = [int](gci $dstFolder | Sort-Object -Property Basename | Select -Last 1).basename.split("_")[1] + 1

    #Get source file
    $f = Get-Item $src
    # Add more zeros in the ToString for more padding
    $dst = Join-Path $dstFolder ($f.BaseName + "_" + $NextNum.ToString("000") + $f.Extension)
    Copy-Item $src $dst

或者,您可以解析文件名,获取末尾的数字,select 最高数字,然后加一以创建新路径。如果您曾经归档一些日常文件,这样做的好处是能够 "pick up where you left off"。

$src       = 'c:\source\dailyfile.dat'
$dstFolder = 'c:\destination'
[int32]$LastFile = Get-ChildItem $dstFolder |
                   Where {$_.BaseName -match "^dailyfile(\d+)"} |
                   ForEach {$Matches[1]} |
                   Sort -Descending |
                   Select -First 1
If ($LastFile) {$LastFile++} else {$LastFile = 0}
$Dest = "C:\Destination\DailyFile$LastFile.dat"
Copy-Item $src -Dest $Dest

这样,如果您每年或几年后存档它们,您最终会得到(假设您始终在文件夹中至少保留 1 个文件):

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         5/21/2015   7:47 PM            2015
d----         5/21/2016   7:47 PM            2016
-a---         5/21/2017   2:00 PM     580984 DailyFile730.dat
-a---         5/22/2017   2:00 PM     392610 DailyFile731.dat