我有一个目录,让我们称之为C:\MoveFile在这个目录中有成千上万个类似的名为的文件
- 姓名修改日期
- Dog_123123_Grey.doc 2015年11月18日
- Dog_123123_Grey(2).doc 2015年11月19日
- Dog_123123_Grey(3).doc 2015年11月17日
- Cat_123123_蓝色(3).doc 01/01/2015
- Cat_123123_墨水(6).doc 07/04/2015
- Cat_123123_墨水(7).doc 2015年4月10日
现在,如果文件名中的版本号是一致编号的(2)等,这将很容易,但我想做的是让powershell运行目录中的项目,并根据修改日期将最新的文件移动到新的文件位置,以便从提供的列表中,新目录将包含。
名称日期修改
- Dog_123123_Grey(2).doc 2015年11月19日
- Cat_123123_蓝色(3).doc 01/01/2015
- Cat_123123_墨水(7).doc 2015年4月10日
据我所知,
gci C:MoveFile*.doc | sort LastWriteTime -desc | select -first 1 | cpi -dest c:NewDirectory
我还没有测试过,因为我知道它不完整,也不会做我需要它做的事情,老实说,我知道不知何故,我需要忽略括号里的任何东西,例如(3)我不知道该怎么做。我曾考虑过只看前15位,但有些文件名可能比这个更长或更短。
沮丧地挠着我的头,有谁比我更有经验?
如果我正确理解您的需求,这里有一个脚本可以帮助您列出要移动的文件(Get-ChildItem
的-File
参数需要PS 3.0)。
在这里,我创建了一个新的Group
属性,在其中删除"版本号"以获得一种"密钥"来对项目进行分组。
我列出文件,按LastWriteTime
降序排列,然后按Group
分组,并取每组的第一项。
$sourceFolder = "C:MoveFile"
$files = Get-ChildItem $sourceFolder -File |
Sort-Object LastWriteTime -Descending |
Select-Object *,@{ n = "Group"; e = { $_.Name -replace "s(d+)","" } }
$filesToMove = $files | Group-Object Group | % {
$_.Group | Select-Object -First 1
}
$filesToMove | Select-Object Name,LastWriteTime
您可能想要做的是:
- 按名称对文件进行分组(不包括文件名中的版本)
- 分别对每组中的文件进行排序
- 从每组中选择最近的
要获得没有版本号的文件名,我们可以使用-replace
regex运算符删除BaseName
字符串末尾包含一个或多个数字的任何一组括号(不包括文件扩展名的文件名):
PS C:> 'Cat_123123_Blue (3)' -replace '(d+)$',''
Cat_123123_Blue
因此,通过这个字符串将它们分组,我们这样做:
$FileGroups = Get-ChildItem -Path C:Movefile -Filter *.doc |Group-Object { ($_.BaseName -replace '(d+)$','').Trim() }
然后迭代我们的组数组:
$FileGroups |ForEach-Object {
# Sort each group, grab the most recent file
$RecentFile = $_.Group |Sort-Object LastWriteTime -Descending |Select -First 1 # Copy it
Copy-Item $RecentFile.FullName -Destination C:NewFolder
}
我比其他人打得更长,但得出了相同的结论:
$Folder = '\Folder'
$Groups = Get-ChildItem -Path $Folder | Group-Object -Property {($_.Name -replace "s(d+)","")}
Foreach ($G in $Groups) {
$G | Select-Object -ExpandProperty Group |
Sort-Object LastWriteTime -Descending | Select -First 1
}
呵呵,迟做总比不做好:p
我只需一行就可以复制更新的2个文件:
gci $origin -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| select -first 2 | Copy-Item -Force -Destination $destination