【问题标题】:Powershell Move Most recent FilePowershell 移动最新文件
【发布时间】:2020-08-25 00:51:20
【问题描述】:

我有一个目录,我们称之为 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 位数字的“不知何故”,但某些文件名可能比这更长或更短。

沮丧地抓挠我的头,有比我更有经验的人有什么想法吗?

【问题讨论】:

  • 我不明白结果中你的两个“猫”文件背后的逻辑。

标签: powershell move


【解决方案1】:

如果我正确理解您的需求,这里有一个脚本可以帮助您列出要移动的文件(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

【讨论】:

  • 该死的,打败我吧 :)
【解决方案2】:

你可能想做的是:

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

要获取不带版本号的文件名,我们可以使用-replace 正则表达式运算符删除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\
} 

【讨论】:

  • 呵呵非常接近我的做法:)
【解决方案3】:

我玩的时间比其他人多一点,但得出了相同的结论:

$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

【讨论】:

  • 该死的,今天没有投票了:)Group-Object { ... }roxxx!你们今天教了我一件非常好的事情!谢谢^^
  • 没问题,很高兴你喜欢它:)
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多