使用Powershell

时间:2018-10-31 07:05:19

标签: powershell

我在这个问题上得到了一些帮助

Renaming a range from files w/Powershell - from first to third from last hyphen

,效果很好,但是现在我遇到了一个新问题。

我的csv文件名现在具有随机数的连字符,如下所示:

abc-def-ghi-jkl-mno-pqr-s-tuv-ke-traffic-by-domains-17-Oct-2018_23-49-38-6d73395f476ad09a7506dc00533933b8.csv
abc-def-ghi-jkl-ke-traffic-by-domains-15-Oct-2018_05-20-36-75eabae7c4123198ff5fe6f4f642449f.csv
abc-def-ghi-jkl-mno--ke-traffic-by-domains-12-Oct-2018_06-23-58-b13eb8f362c09fbe405458fac8af8f8e.csv

连字符的数量因文件而异。

我想使用powershell将其重命名为

abc-17-Oct-2018.csv
abc-15-Oct-2018.csv
abc-12-Oct-2018.csv

我尝试了以下操作:

1。删除“ _”之后的所有内容

Get-ChildItem -Filter *.csv | Foreach-Object -Process { 
    $NewName = [Regex]::Match($_.Name,"^[^_]*").Value + '.csv'
    $_ | Rename-Item -NewName $NewName
}

2。删除第一个“-”之后的所有内容,直到“ ke-traffic-by-domains-”

Get-ChildItem -Filter *.csv | Rename-Item -NewName { 
$word = "-*ke-traffic-by-domains-"
$NewName = $_.Name -split $word + '.csv' 
    $_ | Rename-Item -NewName $NewName
}

但是我坚持要2号删除带有正则表达式的范围。

有人可以告诉我一种更改文件名的方法吗?

1 个答案:

答案 0 :(得分:2)

使用正则表达式匹配您的条件(请参见Regex101.com

Get-ChildItem *.csv |
  Where-Object Name -match '^([^\-]+)-.*?-traffic-by-domains-(\d{1,2}-\D{3}-20\d{2})_'|
    Rename-Item -NewName {"{0}-{1}.csv" -f $Matches[1],$Matches[2]} -WhatIf

如果输出看起来正常,请删除结尾的-WhatIf

在示例csv名称上运行脚本后,我的Ramdrive上的文件:

> gci

    Verzeichnis: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-11-05     09:38              0 abc-12-Oct-2018.csv
-a----       2018-11-05     09:38              0 abc-15-Oct-2018.csv
-a----       2018-11-05     09:38              0 abc-17-Oct-2018.csv