以编程方式从文件名中删除日期

时间:2014-06-25 01:07:10

标签: regex batch-file powershell batch-rename

我正在尝试找到一种解决方案,以编程方式从文件名中删除一些日期。我的文件格式如下:

  

net_20110909_servercleanup.pdf

  

net_servercleanup_20110909.pdf

我已经使用下面发布的解决方案(也可以在Stack Overflow上找到)来更新一些文件名,但我理想情况下有一个解决方案可以更新我目录中的所有文件。我想删除日期和其中一个下划线,以便最终文件如下所示:

  

net_servercleanup.pdf

我想从批处理文件或PowerShell中执行此操作。我已经看到一些解决方案可以使用RegEx来完成这样的事情,但我不太了解它们可以创建一些有用的东西。 有关如何实现这一目标的任何建议吗?

$filelist = (get-childitem c:\folder | Where-Object {$_.mode -match "a"} | foreach-object      {$_.name})
foreach ($file in $filelist)
{
    $len = $file.length
    $newname = $file.substring(0,$len -13)
    $newname = $newname + '.txt'
    Rename-Item C:\folder\$file $newname
    clear-variable newname, len
}

5 个答案:

答案 0 :(得分:1)

我不知道那种语言(?)是什么,但在C ++中,我是通过基于你的分隔符(这种情况下,下划线)将它分成几部分来实现的。基本上,我从第一个下划线之前的字符串中获取子字符串,将其存储到流中(确切地说是字符串流),从第一个下划线之后的字符获取子字符串到第二个下划线之前的字符,... 。 , 等等。然后从流中,我逐个得到碎片并检查它是否是一个整数,如果它是一个整数然后我丢弃它,否则它被附加到一个字符串,如果该字符串不为空则然后我追加添加片段之前的分隔符(下划线)。

我可以用c ++编写代码,但我不确定这是否有用

答案 1 :(得分:1)

PowerShell,未经测试但应该有效:

$filelist = Get-ChildItem C:\folder | Where-Object {$_.Mode -match "a"} `
    | Foreach-Object {$_.FullName}

foreach ($fullpath in $filelist)
{
    $newpath = $fullpath -replace "_(19|20)[0-9]{6}"
    Rename-Item -Path $fullpath -NewName $newpath -WhatIf
}

_(19|20)[0-9]{6}正则表达式匹配以下模式:前导“_”后跟“19”或“20”,然后是任意六位数。如果您的文件名中的日期与您的示例不完全匹配,则可能需要修改正则表达式才能捕获它们。

-WhatIf开关允许您执行“干运行”,即测试cmdlet,如Remove-Item,而不实际执行任何文件操作。当一切看起来都正常并且您已准备好继续进行实际重命名时将其删除。

答案 2 :(得分:1)

如果您知道您的文件名将始终采用您提到的格式,则可以删除下划线和8位数字。试试这个:

get-childitem c:\folder | Where-Object {$_.mode -match "a"} | foreach-object {
  rename-item $_.FullName ($_.FullName -replace '_\d{8}') -WhatIF
}

删除-whatif以实际执行重命名。 -replace参数采用匹配下划线后跟8位数的正则表达式。由于您没有指定替换匹配的内容,因此将替换为空字符串。

请注意,如果文件存在,则会将所有文件重命名为相同的文件名,从而导致Rename-Item出错。如果它们在嵌套的子文件夹中并且您想要遍历它们,则需要向get-childitem添加-Recursive参数。

答案 3 :(得分:1)

试试这个正则表达式:

_\d{8}

并替换为empty。这匹配

中的_20110909

net_20110909_servercleanup.pdfnet_servercleanup_20110909.pdf

,结果为net_servercleanup.pdf

答案 4 :(得分:1)

因为它也被标记为批处理,

此代码使用for /f命令从文件名中删除数字和下划线,保留第一个和第二个剩余元素用下划线连接,然后重命名该文件。

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /r "c:\some\folder" %%f in ("net_*.pdf"
    ) do for /f "tokens=1,2 delims=_0123456789" %%a in ("%%~nf"
    ) do echo ren "%%~ff" "%%a_%%b%%~xf"

对于测试,ren命令以echo命令为前缀。如果输出正确,请删除echo

当然,如果在文件夹中找到多个匹配文件,因为在同一文件夹中不可能有两个具有相同名称的文件,则同一文件夹内的第二个或更高版本文件的重命名操作将失败。