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

时间:2015-05-21 17:41:26

标签: powershell copy rename

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

需要将文件复制到目标文件夹中,并使用比目标文件夹中已有的文件高一位的数字进行编号,以便所有文件共存并且在编号上没有间隙。

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

  • 已存在

    c:\source\dailyfile.dat
    c:\destination\dailyfile0.dat
    
  • 过程

    copy c:\source\dailyfile.dat -> c:\destination\dailyfile1.dat
    
  • 结果

    c:\destination\dailyfile0.dat
    c:\destination\dailyfile1.dat
    

3 个答案:

答案 0 :(得分:1)

或者,您可以解析文件的名称,获取最后的数字,选择最高的数字,然后添加一个以创建新路径。如果您存档了一些日常文件,这样做的好处就是能够“选择离开的地方”。

$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

答案 1 :(得分: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

答案 2 :(得分:0)

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

    $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