Powershell 移动最近的文件
Powershell Move Most recent File
我有一个目录,可以叫它 C:\MoveFile
此目录中有数千个名称相似的文件
- 名称修改日期
- Dog_123123_Grey.doc 2015 年 11 月 18 日
- 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 位数字 'somehow',但有些文件名可能比这更长或更短。
抓耳挠腮,谁比我有经验?
如果我正确理解您的需求,这里有一个脚本可以帮助您列出要移动的文件(Get-ChildItem
的 -File
参数需要 PS 3.0)。
我在这里创建了一个新的 Group
属性,我在其中删除了 "version number" 以获得一种 "key" 来对项目进行分组。
我列出文件,按降序 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
正则表达式运算符删除 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\
}
我比其他人玩的时间长一些,但得出了相同的结论:
$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
我有一个目录,可以叫它 C:\MoveFile 此目录中有数千个名称相似的文件
- 名称修改日期
- Dog_123123_Grey.doc 2015 年 11 月 18 日
- 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 位数字 'somehow',但有些文件名可能比这更长或更短。
抓耳挠腮,谁比我有经验?
如果我正确理解您的需求,这里有一个脚本可以帮助您列出要移动的文件(Get-ChildItem
的 -File
参数需要 PS 3.0)。
我在这里创建了一个新的 Group
属性,我在其中删除了 "version number" 以获得一种 "key" 来对项目进行分组。
我列出文件,按降序 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
正则表达式运算符删除 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\
}
我比其他人玩的时间长一些,但得出了相同的结论:
$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