重命名文件-在第二个下划线之后删除所有字符

时间:2019-07-16 15:50:11

标签: powershell

我需要替换第二个下划线后文件名中包含的时间/日期戳(需要使用相同的格式yyyyMMddHHmmss

示例文件:123456_123456_20190716163001.xml

有时会使用其他字符创建有问题的文件,从而使文件无效,在这种情况下,我需要将其替换为当前时间戳。

示例:123456_123456_current Timestamp here.xml

文件不得超过32个字符(包括扩展名)

我找到了一个脚本,但是它删除了第一个下划线而不是第二个下划线之后的所有内容,我正在努力寻找一种方法来用当前时间戳替换文本。

Get-ChildItem c:\test -Filter 123456_123456*.xml | Foreach-Object -Process { 
    $NewName = [Regex]::Match($_.Name,"^[^_]*").Value + '.xml' $_ | Rename-Item -NewName $NewName 
} 
如果原始文件超过32个字符,则

第二个下划线之后的时间戳将更新为当前时间戳

123456_123456_current Timestamp here.xml

2 个答案:

答案 0 :(得分:0)

这利用了[fileinfo]对象的构造方式。 .BaseName易于使用和使用.Split()。然后可以使用-join将其放回一个基本名称中,最后将扩展名添加到该基本名称中。

# fake reading in a file info object
#    in real life, use Get-ChildItem or Get-Item
$FileObject = [System.IO.FileInfo]'123456_123456_current Timestamp here.xml'

$NewName = -join (($FileObject.BaseName.Split('_')[0,1] -join '_'), $FileObject.Extension)

$NewName

output = 123456_123456.xml

答案 1 :(得分:0)

通过regex主题,您可以执行以下操作:

$CurrentTime = Get-Date -Format 'yyyyMMddHHmmss'
$RegexReplace = "(.*?_.*?_).*(\..*)"
Get-ChildItem c:\test -Filter 123456_123456*.xml |
    Rename-Item -NewName {$_.Name -replace $RegexReplace,"`${1}$CurrentTime`${2}"}

如果需要考虑重复的文件名,则可以增加到$CurrentTime

$CurrentTime = Get-Date -Format 'yyyyMMddHHmmss'
$RegexReplace = "(.*?_.*?_).*(\..*)"
Get-ChildItem c:\test -Filter 123456_123456*.xml |
Rename-Item -NewName {
    $NewName = $_.Name -replace $RegexReplace,"`${1}$CurrentTime`${2}"
    if (test-path $NewName) {
        $CurrentTime = [double]$CurrentTime + 1
        $NewName = $_.Name -replace $RegexReplace,"`${1}$CurrentTime`${2}"
    }
    $NewName
}

说明:

$RegexReplace包含需要进行匹配的regex表达式,以便进行理想的重命名操作。正则表达式的机制如下:

  • .*?_.*?_:匹配最少数量的字符(延迟匹配),后跟一个下划线,然后匹配另一个最少数量的字符,后跟一个下划线。
  • .*:贪心匹配任何字符
  • \.:从字面上匹配点字符(.)。
  • ():此处的括号表示捕获组,第一组为1,第二组为2。稍后在{{1}中将它们分别称为${1}${2} }操作。

由于-replace支持延迟的脚本绑定,因此我们可以直接将Rename-Item -NewName的输出通过管道传递给它。当前管道对象为Get-ChildItem

$_操作使用变量-replace,必须对其进行扩展才能获得成功的结果。因此,我们在替换处使用双引号。由于我们不希望扩展捕获组$CurrentTime${1},因此我们对它们进行了反选。