基于文件名中的年份-保留的最大上次修改日期文件,剩余的将移至存档。
示例:2016年应该有1个文件,应该将其归档到2017年。
我尝试过
$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'
Get-ChildItem -File -Path $sourcedir |
Sort-Object {$_.Basename.Split('-')[1,0]}
Select-Object -Skip 1 | Move-Item -Destination $destdir -Force
Mode Last Modified date Length Filename -a--- 6/25/2018 12:08 AM 31744 abc_2016_2 - Copy - Copy.xls -a--- 6/25/2018 12:07 AM 31744 abc_2016_2 - Copy.xls -a--- 6/25/2018 12:06 AM 31744 abc_2017_1.xls -a--- 6/25/2018 12:07 AM 31744 abc_2017_2.xls -a--- 6/25/2018 12:05 AM 31744 abc_2017_3.xls
以动态形式而不是硬编码形式提出建议。
答案 0 :(得分:0)
这是您和您的几位同事对您要完成的任务的第一条可理解的描述。
让我尝试翻译:
未经测试的脚本
$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'
Get-ChildItem -File -Path $sourcedir*.xls |
Group-Object {$_.Basename.Split('_')[1]} | ForEach-Object {
$_.Group | Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 | Move-Item -Destination $destdir -Force -WhatIf
}
要首先检查结果,我将参数-WhatIf
添加到了Move-Item。
如果一切正常,请删除-WhatIf
组对象之后的中间结果(在我的ramdrive A:上):
Count Name Group
----- ---- -----
2 2016 {A:\abc_2016_2 - Copy - Copy.xls, A:\abc_2016_2 - Copy.xls}
3 2017 {A:\abc_2017_1.xls, A:\abc_2017_2.xls, A:\abc_2017_3.xls}
编辑以遵循lit的hint
这里是使用(捕获组)使用正则表达式提取年份的一种变体
Get-ChildItem -File -Path $sourcedir*.xls |
Where-Object BaseName -match '_(20\d{2})_\d' |
Group-Object {$Matches[1]} | ForEach-Object {
$_.Group | Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 | Move-Item -Destination $destdir -Force -WhatIf
}