我们遇到过一种情况,需要从一大串文件名中批量删除一串字符。每个文件需要删除的字符串都是相同的,但我写不出一个可行的命令。我觉得这是由于文件名中包含的所有特殊字符造成的。这是我目前想到的办法,但效果不佳:
Get-ChildItem -Path 'E:\data\management\2016 401k Profit Sharing from Kesha.xlsx.id[8C00Ea7D-0001].[[电子邮件保护]].phobos'; | 重命名项目-新名称 { $_.FullName -replace “.id[8C00Ea7D-0001].[[电子邮件保护]].火卫一”,”” }
它运行命令时没有出现错误,但由于某种原因,它实际上并没有删除字符串“id[8C00Ea7D-0001]”。[[电子邮件保护]文件名末尾添加“].phobos”。
如您能提供任何帮助我们将不胜感激!
答案1
Replace 使用正则表达式,因此有几个字符需要用“\”进行转义才能按字面意思理解,至少在字符类之外:
- 括号:[]
- 括号: ()
- 大括号: {}
- 运算符:*、+、?、|
- 锚点:^、$
- 其他的: 。, \
将其用于单个项目,就像您问题中的项目一样:
Get-ChildItem -LiteralPath 'E:\data\management\2016 401k Profit Sharing from Kesha.xlsx.id[8C00Ea7D-0001].[[email protected]].phobos' | Rename-Item -NewName {$_.Name -replace ".id\[8C00Ea7D-0001\]\.\[gabbiemciveen@aol\.com\]\.phobos"}
此外,将 LiteralPath 与 Get-ChildItem 结合使用,以确保没有字符被解释为通配符(如果存在)。
使用它来进行目录范围的重命名:
Get-ChildItem -LiteralPath 'E:\data\management\' -Filter *[8C00Ea7D-0001].[[email protected]].phobos | Rename-Item -NewName {$_.Name -replace ".id\[8C00Ea7D-0001\]\.\[gabbiemciveen@aol\.com\]\.phobos"}
请注意,过滤器不使用正则表达式。