Powershell移动最近的文件



我有一个目录,让我们称之为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

您可能想要做的是:

  1. 按名称对文件进行分组(不包括文件名中的版本)
  2. 分别对每组中的文件进行排序
  3. 从每组中选择最近的

要获得没有版本号的文件名,我们可以使用-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

最新更新