计算复制到文件夹中的文件的新版本
numerate new versions of a file copied into a folder
我有一个每天生成的文件。它是用文件名 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
像这样的东西应该可以工作:
$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
我有一个每天生成的文件。它是用文件名 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
像这样的东西应该可以工作:
$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