国家和年份 - 上次修改日期

Posted

技术标签:

【中文标题】国家和年份 - 上次修改日期【英文标题】:country & Year -Last Modified date 【发布时间】:2018-07-09 09:32:29 【问题描述】:

我正在尝试按LastWriteTime 从文件名顺序中拆分国家和年份,并希望按年份将剩余文件移动到存档文件夹,但只能过滤年份而不是国家名称 代码:

$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir   = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'
Get-ChildItem -File -Path $sourcedir |
    Where-Object BaseName -match '_(20\d2)_\d' |
    Group-Object $Matches[1] |
    ForEach-Object 
        $_.Group | Sort-Object LastWriteTime -Descending |
            Select-Object -Skip 1 |
            Move-Item -Destination $destdir -Force 
    

输出是

模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- -a--- 2018 年 6 月 25 日上午 12:08 31744 abc Italy_2016_2 - 复制 - Copy.xls -a--- 6/25/2018 12:07 AM 31744 abc Italy_2016_2 - Copy.xls -a--- 6/25/2018 12:06 AM 31744 abc China_2017_1.xls -a--- 2018 年 6 月 25 日上午 12:07 31744 abc NL_2017_2.xls -a--- 6/25/2018 12:05 AM 31744 abc Finland_2017_3.xls

在上面的数据中,第 2 行将进入存档,因为意大利 2016 年的最后写入时间是 12:08。 我正在尝试通过Group-Object $_.Basename.Split(' ')[2] 拆分名称,但无法在上述情况下使用

also tried:Where-Object BaseName -match ' ([a-z]+_20\d2)_\d' | &  Where-Object BaseName -match '_(20\d2)_\d' |

$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir   = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'
Get-ChildItem -File -Path $sourcedir |
Where-Object BaseName -match ' ([a-z]+_20\d2)_\d' |
    Group-Object $Matches[1] |
    ForEach-Object 
        $_.Group | Sort-Object LastWriteTime -Descending |
            Select-Object -Skip 1 |
            Move-Item -Destination $destdir -Force 
    

both conditions are tried separately gives the error message:

Cannot index into a null array.
At C:\Users\garang\Documents\input_files\Script\Tracker.ps1:3 char:1
+ Get-ChildItem -File -Path $sourcedir |
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

我认为问题出在 Group-Object $Matches[1] |...如果我删除此查询不会给出错误...我是否必须定义此 $matches

--Unable to find country and year when the file name is changed
abc N Refund Maker_Japan_2017_302413 modified date :26/06 10:20
abc N Refund Maker_Japan_2017_Extra  modified date:26/06 10:30

尝试了新的正则表达式:

$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir   = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'

Get-ChildItem -File -Path $sourcedir |
  Where-Object BaseName -match '_([a-z]+_20\d2)_\d'|
    Group-Object $Matches[1] |
      ForEach-Object 
        $_.Group | Sort-Object LastWriteTime -Descending |
          Select-Object -Skip 1 |
            Move-Item -Destination $destdir -Force 
      
but file is not moving
abc N Refund Maker_Japan_2017_302413 modified date :26/06 10:20
abc N Refund Maker_Japan_2017_Extra  modified date:26/06 10:30
abc N Refund Macker_Italy_2017_302413 modified date :26/06 10:20 
abc N Refund Macker_Italy_2017_extra modified date :26/06 10:30


i got new  logic  into it and getting output also how fix this in the query

   $Match = "[^_]+_[0-9]4"
$Lines = get-clipboard
$Results = $Lines | %$_ -Match $Match | %$Matches[0]

output:

Japan_2017
Japan_2017
Italy_2017
Italy_2017

这是预期的 好的……举一个新的例子……这是四个文件……在这种情况下……需要按国家和年份分组……然后 max last modified 文件将在那里,其他文件将移动该国家/地区的档案 和年份...所以这里的第 2 和第 3 个文件将进入存档....简单的方式国家和年份在示例中重复了两次......所以较少修改的日期文件将进入该年的存档和国家...

abc N Refund Maker_Japan_2017_302413 modified date :26/06 10:20
abc N Refund Maker_Japan_2017_Extra  modified date:26/06 10:30
abc N Refund Macker_Italy_2017_302413 modified date :26/06 10:20 
abc N Refund Macker_Italy_2017_xyz modified date :26/06 10:30

【问题讨论】:

更改 Where 中的 RegEx 以包括国家,因此分组也包括它:Where-Object BaseName -match ' ([a-z]+_20\d2)_\d' | 您报告的错误与 where-object 无关,看起来变量 $sourcedir 没有填充。 当然,你期待什么? RegEx 无法神奇地适应新格式。 如果新格式用下划线包围国家/地区,则 RegEx 为 '_([a-z]+_20\d2)_\d' 您的初始方案在 year_ 后面有一个数字,不包括 Extra 这是 RegEx 的不必要部分,因此请删除 RegEx 末尾的 \d 【参考方案1】:

对不起,我的错。您必须在 Group-Object 中的 $Matches[1] 周围加上花括号

$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir   = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'

Get-ChildItem -File -Path $sourcedir |
  Where-Object BaseName -match ' ([a-z]+_20\d2)_\d' |
    Group-Object $Matches[1] |
      ForEach-Object 
        $_.Group | Sort-Object LastWriteTime -Descending |
          Select-Object -Skip 1 |
            Move-Item -Destination $destdir -Force 
      

用不同的路径测试

> ls
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018-07-09     23:04                Archive
-a----       2018-06-25     12:06              6 abc China_2017_1.xls
-a----       2018-06-25     12:05              6 abc Finland_2017_3.xls
-a----       2018-06-25     12:08              6 abc Italy_2016_2 - Copy - Copy.xls
-a----       2018-06-25     12:07              6 abc NL_2017_2.xls


PoSh 23:04:43 A:\test_______________________________________________________________
> gci .\Archive\
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-06-25     12:07              6 abc Italy_2016_2 - Copy.xls

【讨论】:

【参考方案2】:

另一个答案只改变了细节(不明白你为什么会遇到问题)

这些文件

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-06-26     10:20              6 abc N Refund Macker_Italy_2017_302413
-a----       2018-06-26     10:30              6 abc N Refund Macker_Italy_2017_xyz
-a----       2018-06-26     10:20              6 abc N Refund Maker_Japan_2017_302413
-a----       2018-06-26     10:30              6 abc N Refund Maker_Japan_2017_Extra

还有这个脚本:

## Q:\Test\2018\07\09\SO_51242305.ps1
$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir   = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'

$sourcedir = 'A:\Test'
$destdir   = 'A:\Test\Archive'

Get-ChildItem -File -Path $sourcedir |
  Where-Object BaseName -match '_([a-z]+_20\d2)_' |
    Group-Object $Matches[1] |
      ForEach-Object 
        $_.Group | Sort-Object LastWriteTime -Descending |
          Select-Object -Skip 1 |
            Move-Item -Destination $destdir -Force
      

得到这个输出:

> gci $sourcedir -r
    Verzeichnis: A:\Test

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018-07-12     20:15                Archive
-a----       2018-06-26     10:30              6 abc N Refund Macker_Italy_2017_xyz
-a----       2018-06-26     10:30              6 abc N Refund Maker_Japan_2017_Extra

    Verzeichnis: A:\Test\Archive

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-06-26     10:20              6 abc N Refund Macker_Italy_2017_302413
-a----       2018-06-26     10:20              6 abc N Refund Maker_Japan_2017_302413

【讨论】:

以上是关于国家和年份 - 上次修改日期的主要内容,如果未能解决你的问题,请参考以下文章

SharePoint 上次修改日期和匿名访问

Hive - 如何在 Hive 中跟踪和更新增量表的上次修改日期?

在数据框中编辑日期以在熊猫中显示年份

C#.net 日期控件,如何选择年份,目前只能一个月一个月的选,无法直接选择其它年份

是否可以从资产文件中获取上次修改日期?

根据“上次修改日期”循环浏览文件夹中的所有文件