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

如何使用PowerShell替换文件夹(和子文件夹)中所有文件名的多个字符(<;3),powershell,replace,match,Powershell,Replace,Match,我试图使用PowerShell设置一个条件,即如果文件名包含以下任何符号(,%,&,+{,},~),则将这些符号替换为“”。我想将其应用于所有文件和文件夹名称(包括子文件夹中的文件) 我有下面的代码,它部分工作,因为它只用于替换2个符号“(,&)”。如果我想替换更多的符号,这是行不通的。弹出一条错误消息,只有第一个符号被替换。有没有办法修复此代码 Get-ChildItem -Recurse | ` Where-Object {$_.Name -match '&' -or $_.N

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

我有下面的代码,它部分工作,因为它只用于替换2个符号“(,&)”。如果我想替换更多的符号,这是行不通的。弹出一条错误消息,只有第一个符号被替换。有没有办法修复此代码

Get-ChildItem -Recurse | `
   Where-Object {$_.Name -match '&' -or $_.Name -match '%' } | `
     Rename-Item -NewName { $_.Name -replace '&','_' -replace '%','_' }
由于我没有编码方面的经验,如果您能提供解决此问题的完整代码,我将不胜感激,谢谢

使用正则表达式(
[…]
)匹配所有感兴趣的字符:

Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace '[#%&+{}~]', '_' }
请注意,我已经取消了
Where Object
调用,因为不需要预筛选文件:
-replace
如果正则表达式不匹配,则返回原始字符串;如果
-NewName
参数与现有文件名相同,则
Rename Item
是有效的no op


另外,如果你用
结束一行,你也不需要用
`
来表示行的继续。

我正在尝试
获取childitem-filter'*[\%&+{}]*.
以提高速度,但是它看起来不像-filter使用方括号通配符。@js2010:
-filter
参数只接受
*
-
-filter
是一个提供程序参数,在这种情况下,它由底层文件系统解释,而不是由PowerShell解释-只有PowerShell的通配符语言支持
[…]
@mlement0文档中没有任何内容表明只有一部分通配符起作用。@js2010:更糟糕的是:文档主动建议使用PowerShell的通配符语言-这显然不是事实,正如您所经历的那样。我鼓励您在网站上创建一个专门的问题。Re什么样的模式
-Filter
实际支持-请参见@js2010:P.S:在本例中,您可以使用
-Include
,以便使用PowerShell的通配符语言,但这会很慢,因为必须首先检索所有项,然后PowerShell应用过滤。我的猜测是,在这种情况下,您不会获得太多收益,缺点是您会复制搜索模式。