Powershell移动最近的文件

Powershell移动最近的文件,powershell,move,Powershell,Move,我有一个目录,我们叫它C:\MoveFile 在这个目录中有数千个类似名称的文件 姓名日期修改 Dog_123123_Grey.doc 2015年11月18日 Dog_123123_Grey(2).文件19/11/2015 Dog_123123_Grey(3).文件17/11/2015 Cat_123123_蓝(3).文件01/01/2015 Cat_123123_粉色(6)。文件07/04/2015 Cat_123123_粉色(7)。文件10/04/2015 现在,如果文件名中的版本号是一

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

  • 姓名日期修改
  • Dog_123123_Grey.doc 2015年11月18日
  • Dog_123123_Grey(2).文件19/11/2015
  • Dog_123123_Grey(3).文件17/11/2015
  • Cat_123123_蓝(3).文件01/01/2015
  • Cat_123123_粉色(6)。文件07/04/2015
  • Cat_123123_粉色(7)。文件10/04/2015
现在,如果文件名中的版本号是一致编号的(2)等,这将很容易,但我想做的是让powershell运行目录中的项目,并根据修改日期将最新文件移动到新文件位置,以便从提供的列表中,新目录将包含

姓名日期修改

  • Dog_123123_Grey(2).文件19/11/2015
  • Cat_123123_蓝(3).文件01/01/2015
  • Cat_123123_粉色(7)。文件10/04/2015
现在我能想到的是

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
    字符串末尾包含一个或多个数字的任何括号集(包含文件扩展名的文件名):

    因此,要按此字符串对它们进行分组,我们需要:

    $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
    

    我不明白你的结果中两个“cat”文件背后的逻辑。该死,比我快:)呵呵,非常接近我的方法:)该死,今天不再投票:)
    Group Object{…}
    roxxx!你们俩今天教了我一件很好的事情!谢谢^没问题,很高兴你喜欢:)
    gci $origin -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| select -first 2 | Copy-Item -Force -Destination $destination