我需要替换第二个下划线后文件名中包含的时间/日期戳(需要使用相同的格式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
答案 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}
,因此我们对它们进行了反选。