目标文件名是这样的: specificLeaderString 2022-01-30.pdf specificLeaderString 2022-02-28.pdf specificLeaderString 2022-03-31.pdf ETC 我想要的名字是 yyyyMMdd newSfx.pdf
我在 cd 到 poweshell 目录后使用的脚本:
dir | rename-item -NewName {$_.name -replace '(\d[4])-(\d\d)-(\d\d}).pdf','[$1][$2][$3] smithChq.pdf'}
目录中的文件名没有变化
我也试过了
dir | rename-item -NewName {$_.name -replace '(\d\d\d\d)-(\d\d)-(\d\d}).pdf','[$1][$2][$3] GGRbc.pdf'}
我希望所有选定的带有日期后缀的文件都用日期重命名,不带连字符作为前导,并省略原始前导部分,并在文件后缀 .pdf 前插入“SmithChq”
顺便说一句,我正在使用 Windows 10 专业版和所有重要更新
解决此问题的最佳方法是使用 user21534492 发布的字符串替换方法,除非字符串的其余部分包含破折号。您的代码不起作用,因为破折号是正则表达式的特殊字符,您需要使用十六进制值 0x2d。以下代码经过测试
$filenames = @('specificLeaderString 2022-01-30.pdf', 'specificLeaderString 2022-02-28.pdf', 'specificLeaderString 2022-03-31.pdf')
$pattern = '\d{4}\x2d\d{2}\x2d\d{2}'
foreach($filename in $filenames)
{
Write-Host $filename
$filename -match $pattern
$date = $Matches[0]
$dateNoDash = $date.Replace("-","")
$newFilename = $filename -replace $date, $dateNoDash
Write-Host $newFilename
}
这是一种方法:
$leader = 'specificLeaderString'
gci *.pdf | where BaseName -match [Regex]::Escape($leader) |
Rename-Item -NewName {
'{0}{1}{2} newSfx.pdf' -f [Regex]::Match($_.BaseName , '(\d{4})-(\d{2})-(\d{2})').Groups.Value[1..3]
}
或者您可以利用
[DateTime]
类型:
gci *.pdf | where BaseName -match [Regex]::Escape($leader) |
Rename-Item -NewName {
'{0:yyyy}{0:MM}{0:dd} newSfx.pdf' -f [DateTime][Regex]::Match($_.BaseName , '\d{4}-\d{2}-\d{2}').Value
}
使用
Get-ChildItem
(别名dir
)您可以添加像Filter
和File
这样的参数来帮助搜索您想要重命名的文件。
因为过滤器不能使用正则表达式,在这种情况下,我建议将结果通过管道传递给
Where-Object
子句,以过滤以日期模式结尾的文件名。
那么这只是一个管道问题
Rename-Item
$rootFolder = 'X:\Somewhere'
$newSuffix = 'smithChq'
(Get-ChildItem -Path $rootFolder -Filter '*.pdf' -File) | # first filter for files with .pdf extension
Where-Object { $_.BaseName -match '(\d{4}-\d{2}-\d{2})$' } | # next filter on files ending in yyyy-MM-dd
Rename-Item -NewName { '{0} {1}{2}' -f ($matches[1] -replace '-'), $newSuffix, $_.Extension }
Get-ChildItem 行位于括号之间,以便在通过管道传递结果之前让该部分完成。否则,它可能会选择已经重命名的文件(=浪费时间)
附言你的正则表达式使用
\d[4]
,但是.NET支持的正则表达式量词是大括号,所以应该是\d{4}
一个简单的替换就可以解决问题。不幸的是,我无法帮助您修复 RegExp,对我也没有用。
dir | rename-item -NewName {$_.name.Replace("-","").Replace("."," SmithChq.")}
希望对您有所帮助!
编辑:对不起,完全忘了添加后缀。