我在 powershell 中重命名文件时使用的正则表达式有什么问题

问题描述 投票:0回答:4

目标文件名是这样的: specificLeaderString 2022-01-30.pdf specificLeaderString 2022-02-28.pdf specificLeaderString 2022-03-31.pdf ETC 我想要的名字是 yyyyMMdd newSfx.pdf

  • yyyyMMdd 没有连字符的日期

我在 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 专业版和所有重要更新

windows powershell file-rename regexp-replace
4个回答
0
投票

解决此问题的最佳方法是使用 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
}  

0
投票

这是一种方法:

$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
}

0
投票

使用

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}


0
投票

一个简单的替换就可以解决问题。不幸的是,我无法帮助您修复 RegExp,对我也没有用。

dir | rename-item -NewName {$_.name.Replace("-","").Replace("."," SmithChq.")}

希望对您有所帮助!

编辑:对不起,完全忘了添加后缀。

© www.soinside.com 2019 - 2024. All rights reserved.