在Windows Powershell中替换文件名中的特殊字符

4
我正在尝试将一堆文件从Windows目录移动到SharePoint,并需要重命名文件和目录名称,因为它们在目标文件系统上不被允许。
我在这里找到了大部分需要完成任务的内容: 替换Windows子文件夹中所有#符号的文件名
Get-ChildItem -Filter "*`#*" -Recurse |
Rename-Item -NewName {$_.name -replace '#','No.' } -Verbose

邪恶用户evilSnobu提供的解决方案对于这些字符 ~, #, %, & 有效。
在sharepoint上不允许使用的其他字符包括:+, *, {, }, \, :, <, >, ?, /, |, “
我不确定哪些字符实际上在源Windows文件系统上被允许,但“+”是可以的,显然很多文件名都含有该字符。
对于那些文件名,PowerShell会报错,说它使正则表达式无效。无论使用该字符还是其等效的ASCII码进行转义,情况都是如此。
Get-ChildItem -Filter "*`+*" -Recurse |
>> Rename-Item -NewName {$_.name -replace '+','_' } -Verbose

很遗憾,这并不起作用。您有没有处理这些问题的任何想法?谢谢Tim。

3个回答

9

我目前清理文件名/路径的方法是这样的:

$Path.Split([IO.Path]::GetInvalidFileNameChars()) -join '_'

这个使用了.NET函数来处理当前操作系统中的非法字符(因为.NET现在不仅在Windows上运行)。它将会用_替换任何非法字符。


1
这样一个简单的解决方案 :) 像魔法一样奏效! - Alberto S.
1
这非常有用!谢谢您的发布! - Jeff Zeitlin

3

在你不确定的列表中,除了+{}以外,其他都是禁止的。要转义正则表达式中的字符,请使用\。例如,由于$是字符串末尾锚定正则表达式,因此使用\$来匹配字面上的$。或者,你可以考虑使用$name.replace("+","_")而不是$name -replace '+','_',后者不会使用正则表达式。


转义“+”符号非常成功,非常感谢。Get-ChildItem -Filter "`+" -Recurse |
Rename-Item -NewName {$.name -replace '+','' } -Verbose
- TIM

1
Rename-Item -NewName {$_.name -replace '\+','_' } -Verbose  

当我想要将"filename (1)"缩减为"filename"时,解决问题的方法非常棒。
我只需修改脚本如下:

Rename-Item -NewName {$_.name -replace '\(1\)','' } -Verbose

它确实解决了繁琐的人工劳动问题。

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