Powershell移动最近的文件
我有一个目录,我们叫它C:\MoveFile 在这个目录中有数千个类似名称的文件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 现在,如果文件名中的版本号是一
- 姓名日期修改
- 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
- 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