如何使用PowerShell替换文件夹(和子文件夹)中所有文件名中少于3个字符的多个字符?

3

我试图使用PowerShell设置一个条件,如果文件名包含以下任何符号(#, %, &, +, {, }, ~),则将这些符号替换为"_"。 我想将其应用于所有文件和文件夹名称(包括子文件夹中的文件)。

我有下面的代码,部分工作正常,因为它只适用于替换2个符号"(%, &)". 如果我想要替换更多符号,它就不起作用了。会出现一个错误消息,并且只有第一个符号被替换。有没有办法修复这个代码?

Get-ChildItem -Recurse | `
   Where-Object {$_.Name -match '&' -or $_.Name -match '%' } | `
     Rename-Item -NewName { $_.Name -replace '&','_' -replace '%','_' }

由于我没有编码经验,如果您能提供完整的代码来解决这个问题,我会非常感激,谢谢!

1个回答

4
使用正则表达式 字符类/集合[...])来匹配所有感兴趣的字符:
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace '[#%&+{}~]', '_' }

请注意,我已经删除了Where-Object调用,因为预先过滤文件是不必要的:
-replace如果正则表达式不匹配,则返回原始字符串,如果-NewName参数与现有文件名相同,则Rename-Item是一个有效的无操作。

此外,如果您用|结束一行,则不需要`来表示行连续。


我尝试使用get-childitem -filter '*[#%&+{}~]*'来提高速度,但似乎-filter不接受方括号通配符。 - js2010
@js2010:-Filter 参数只接受 ?* - -Filter 是一个 提供程序 参数,在这种情况下是由底层的 文件系统 解释的,而不是由 PowerShell 解释的 - 只有 PowerShell 的通配符语言支持 [...] - mklement0
@mlement0 文档中没有说明只有一部分通配符有效。 - js2010
@js2010:更糟糕的是,文档还积极建议使用PowerShell的通配符语言——显然这是不正确的,正如您所经历的那样。我鼓励您在https://github.com/MicrosoftDocs/PowerShell-Docs/issues上创建一个专门的问题。关于`-Filter`实际支持哪些模式,请参见https://dev59.com/kWw15IYBdhLWcg3wZ7AY#17739503。 - mklement0
@js2010:附言:在这种情况下,您可以使用“-Include”来使用PowerShell的通配符语言,但这样会很慢,因为首先必须检索所有项目,然后PowerShell应用过滤。我猜您在这种情况下不会获得太多收益,而且缺点是您必须重复搜索模式。 - mklement0

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