如何在PowerShell中重命名所有文件类型中的字符串

时间:2017-06-27 08:01:50

标签: powershell

我有一个包含所有文件类型的文件夹,例如:

10November2017.txt
01October1986.txt
20September2000.dat
13February1992.txt

我使用PowerShell运行以下2个任务:

  1. 搜索扩展名为.txt的所有文件,然后
  2. 以“yyyyMMdd.txt”格式重命名所有返回的.txt文件,例如:

    • 20171110.txt
    • 19861001.txt
    • 19920113.txt
  3. 我能够完成任务1,但有点在任务2中挣扎。 请你帮忙吗?

    提前致谢

3 个答案:

答案 0 :(得分:6)

使用DateTime.ParseExact() method根据BaseName属性(没有扩展名的文件名)解析日期,然后将其转换回所需格式的字符串。

使用MMMM说明符

指定月份的全名
$txtFiles = Get-ChildItem .\path\to\files -Filter *.txt
foreach($file in $txtFiles){
    try{
        $fileDate = [datetime]::ParseExact($file.BaseName,'ddMMMMyyyy',$null)
        $file |Rename-Item -NewName ('{0:yyyyMMdd}{1}' -f $fileDate,$file.Extension)
    }
    catch {
        Write-Warning "File base name $($file.BaseName) not recognized as valid date"
    }
}

答案 1 :(得分:1)

这是一个班轮:

gci -File *.txt|where BaseName -match '^(\d{2})(\w{3,9})(\d{4})$'|Ren -NewName {$matches[3]+([DateTime]::ParseExact($matches[2],"MMMM",$CIUS).Month.ToString('00'))+$matches[1]+$_.Extension} -Whatif

如果输出看起来没问题,请删除尾随-whatif

如果您的区域设置不符合要匹配的月份名称,则不能将$null与ParseExact一起使用,但必须定义不同的区域性变量:

$CIUS = New-Object system.globalization.cultureinfo("en-US")

并用该变量替换$null

较长的变体

$CIUS = New-Object system.globalization.cultureinfo("en-US")
Get-ChildItem -File *.txt|
  Where-Object BaseName -match '^(\d{2})(\w{3,9})(\d{4})$'|
    Rename-Item -NewName {$matches[3]+`
        ([DateTime]::ParseExact($matches[2],"MMMM",$CIUS).Month.ToString('00'))+`
        $matches[1]+`
        $_.Extension"} -Whatif

有解释

  • -match RegEx锚定在开始^和结束$,并从日,月名和年份构建三个组。
  • 重命名中的脚本块以相反的顺序接收名为$matches的组
  • 使用ParseExact将月份名称替换为序号。

如果你需要反转这个(使用不同的语言环境),例如8月的法语名称:

PS> $CIFR = New-Object system.globalization.cultureinfo("fr-FR")
PS> $CIFR.DateTimeFormat.MonthNames[8 -1]
août

获取cultureinfo项目列表:

[System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures)

答案 2 :(得分:1)

我建议使用另一种单线解决方案,可能会更短一点:

Get-ChildItem -Filter "*.txt" -Recurse | Where-Object {$_.BaseName -match "\D"} | Rename-Item -NewName {[datetime]::ParseExact($_.Basename, "ddMMMMyyyy", $null).ToString("yyyyMMdd") + $_.extension}

说明

-Filter "*.txt"仅过滤文字文件

-Recurse | Where-Object {$_.BaseName -match "\D"}仅对包含非数字字符的对象进行迭代,以便过滤掉新重命名的项目

[datetime]::ParseExact($_.Basename, "ddMMMMyyyy", $null)将文件名(无扩展名)转换为日期对象

.ToString("yyyyMMdd") + $_.extension将日期对象转换为所需的字符串表示形式并附加扩展名