windows 什么是错误的与我的正则表达式中使用的重命名文件在powershell

7cjasjjr  于 2023-04-13  发布在  Windows
关注(0)|答案(4)|浏览(120)

目标文件名如下所示: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'}

我希望所有选定的文件与日期后缀被重命名为日期没有连字符作为铅,并遗漏了原来的领先部分,并插入“SmithChq”前的文件后缀。pdf
顺便说一句,我正在使用Windows 10专业版的所有重要更新

bmp9r5qi

bmp9r5qi1#

解决此问题的最佳方法是使用user21534492发布的字符串替换方法,除非字符串的其余部分包含破折号。您的代码不起作用,因为破折号是Regex特殊字符,您需要使用十六进制值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
}
uqxowvwt

uqxowvwt2#

这里有一个方法:

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

cx6n0qe33#

使用Get-ChildItem(别名dir),您可以添加FilterFile等参数,以帮助搜索要重命名的文件。
因为过滤器不能使用正则表达式,在这种情况下,我建议将结果通过管道传递到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行位于方括号之间,以便在通过管道传输结果之前完成该部分。否则,它可能会选择已经重命名的文件(=浪费时间)
P.S.你的正则表达式使用\d[4],但是.NET支持的正则表达式量词是花括号,所以应该是\d{4}

huwehgph

huwehgph4#

一个简单的替换就可以了。不幸的是,我不能帮助你修复RegExp,对我也不起作用。

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

希望有帮助!
编辑:对不起,完全忘记添加后缀。

相关问题