【问题标题】:numerate new versions of a file copied into a folder计算复制到文件夹中的文件的新版本
【发布时间】:2015-08-03 12:53:16
【问题描述】:

我有一个每天生成的文件。它使用文件名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
    

【问题讨论】:

    标签: powershell copy rename


    【解决方案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
    

    【讨论】:

    • 我会让模式更具体(^dailyfile(\d+)$),否则它可能会匹配不应该匹配的内容。
    • @AnsgarWiechers 我同意,并更新了我的答案以反映这一点。谢谢,您的意见一如既往的棒!
    • 奉承会让你一事无成。 :þ
    【解决方案2】:

    这样的事情应该可以工作:

    $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 当目标文件夹中没有文件但当目标文件夹中已存在文件时“do 语句”挂起时,这正在执行我需要的操作。文件夹。
    • @Mike 我的错。我忘记了增加$n 的步骤。查看更新的答案。
    • 完美!这正是我所需要的。谢谢!
    【解决方案3】:

    添加到 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
    

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 2017-12-25
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多