Powershell移动最近的文件

时间:2015-12-09 11:43:25

标签: powershell move

我有一个目录,我们称之为C:\ MoveFile 在这个目录中有数千个类似名称的文件

  • 名称修改日期
  • Dog_123123_Grey.doc 18/11/2015
  • Dog_123123_Grey(2).doc 19/11/2015
  • Dog_123123_Grey(3).doc 17/11/2015
  • Cat_123123_Blue(3).doc 01/01/2015
  • Cat_123123_Pink(6).doc 07/04/2015
  • Cat_123123_Pink(7).doc 10/04/2015

现在,如果文件名中的版本号始终为编号(2)等,那将很容易,但我想要做的是使用powershell运行目录中的项目并根据日期移动最新文件修改为新的文件位置,以便从提供的列表中包含新目录。

名称修改日期

  • Dog_123123_Grey(2).doc 19/11/2015
  • Cat_123123_Blue(3).doc 01/01/2015
  • Cat_123123_Pink(7).doc 10/04/2015

现在,据我所知,

gci C:\MoveFile\*.doc | sort LastWriteTime -desc | select -first 1 | cpi -dest c:\NewDirectory

我没有经过测试,因为我知道它不完整而且不会做我需要它做的事情,说实话我知道我不知道我需要忽略括号中的任何内容,例如(3)我不知道该怎么做。我曾考虑过以某种方式看待'只查看前15位数字,但有些文件名可能比这更长或更短。

沮丧地抓我的头,任何经验比我有任何想法的人?

4 个答案:

答案 0 :(得分:4)

如果我理解你的需要,这里有一个脚本可以帮助你列出要移动的文件(-File Get-ChildItem参数所需的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 :(得分:3)

您可能想要做的是:

  1. 按名称分组文件(不包括文件名中的版本)
  2. 分别对每个组中的文件进行排序
  3. 从每个组中选择最新的
  4. 要获取没有版本号的文件名,我们可以使用-replace正则表达式运算符删除BaseName字符串末尾包含一个或多个数字的任何括号集(文件名为exccuding文件扩展名):

    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\
    } 
    

答案 2 :(得分:2)

我比其他人玩的时间更长,但得出了同样的结论:

$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

答案 3 :(得分:0)

我能够通过一行获得这些结果,以复制较新的2个文件:

gci $origin -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| select -first 2 | Copy-Item -Force -Destination $destination