如何在Powershell中使用正则表达式重命名文件?

4

我有一些文件名末尾带有单词和数字。不知何故,我的正则表达式无法正常工作。以下是我的文件名示例:

test abc12345.zip
abcd def98765.zip
test xyz23456.zip

这是我的正则表达式:

dir | rename-item -NewName {$_.name -replace "(\w\w\w\d\d\d\d\d.zip)","[$1].zip"}

当我运行选择代码段时,它会删除以下内容:
abc12345
def98765
xyz23456

从文件名中提取并插入括号:
test [].zip
abcd [].zip
test [].zip

我该如何保留括号内的内容?不确定为什么我的代码会删除括号中间的所有内容。

test [abc12345].zip
abcd [def98765].zip
test [xyz23456].zip

可能是Powershell脚本不接受$(美元)符号的重复问题。 - ZiggZagg
1个回答

7

将双引号替换为单引号。Powershell解析双引号的内容,并用不存在/空的变量$1的内容替换您的$1


此外,您的正则表达式可以使用单词和数字字符的量词来简化

 (\w\w\w\d\d\d\d\d.zip)

可以将其更改为较短的版本

(\w{3}\d{5}.zip)

看到你期望的输出,你当前捕获组还有另一个问题,即包括.zip扩展名。实际上,你想要的是不捕获扩展名的内容。
(\w{3}\d{5}.zip)

目的是只捕获单词/数字部分

(\w{3}\d{5}).zip

现在你可以使用捕获组将它们括在括号内。你最终的正则表达式和替换可能看起来像这样:

dir | rename-item -NewName {$_.name -replace '(\w{3}\d{5}).zip','[$1].zip'}

我发现了另一个错误: dir | rename-item -NewName {$_.name -replace "(\w\w\w\d\d\d\d\d).zip",'[$1].zip'}将.zip移出了组 但是代码运行得很好。谢谢! - user3683976

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接