我有一个目录,我们称之为C:\ MoveFile 在这个目录中有数千个类似名称的文件
现在,如果文件名中的版本号始终为编号(2)等,那将很容易,但我想要做的是使用powershell运行目录中的项目并根据日期移动最新文件修改为新的文件位置,以便从提供的列表中包含新目录。
名称修改日期
现在,据我所知,
gci C:\MoveFile\*.doc | sort LastWriteTime -desc | select -first 1 | cpi -dest c:\NewDirectory
我没有经过测试,因为我知道它不完整而且不会做我需要它做的事情,说实话我知道我不知道我需要忽略括号中的任何内容,例如(3)我不知道该怎么做。我曾考虑过以某种方式看待'只查看前15位数字,但有些文件名可能比这更长或更短。
沮丧地抓我的头,任何经验比我有任何想法的人?
答案 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)
您可能想要做的是:
要获取没有版本号的文件名,我们可以使用-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