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

时间:2018-05-10 17:00:33

标签: regex powershell

我正在尝试将一堆文件从Windows目录移动到sharepoint,需要重命名目标文件系统上不允许的文件和目录名。

我需要完成我在此处找到的任务所需的大部分内容: Replacing all # in filenames throughout subfolders in Windows

Get-ChildItem -Filter "*`#*" -Recurse |
Rename-Item -NewName {$_.name -replace '#','No.' } -Verbose

evilSnobu提供的解决方案就像这些角色的魅力一样〜,#,%,&

sharepoint上不允许的其他字符应该是:+,*,{,},\,:,<,>,?,/,|,“

我并不是很确定首先在源窗口文件系统上允许哪些,但是" +"很显然,很多文件名中都有这个字符。

对于那些我从PowerShell收到错误的人说它使正则表达式无效。不幸的是,这对于使用该字符或使用等效的ascii代码进行删除是真的。

Get-ChildItem -Filter "*`+*" -Recurse |
>> Rename-Item -NewName {$_.name -replace '+','_' } -Verbose

不幸的是,这不起作用。关于如何处理这些问题的任何想法?

谢谢蒂姆

2 个答案:

答案 0 :(得分:1)

我当前清除文件名/路径的方法是:

 private static void checkSurrounding(char[][] list, int x, int y) {
    for(int dx = -1; dx <= 1; dx++) {
        if ((x + dx >= 0) && (x + dx < list.length)) {
            for(int dy = -1; dy <= 1; dy++) {
                if ((y + dy >= 0) && (y + yd < list[x + dx].length) && (!(dx == 0 && dy == 0))) {
                    System.out.print(list[x + dx][y + dy]);
                }
            }
        }
    } 
}

这对当前的操作系统无效字符使用.NET功能(因为.NET现在不仅可以在Windows上运行)。它将用$Path.Split([IO.Path]::GetInvalidFileNameChars()) -join '_' 替换所有无效字符。

答案 1 :(得分:1)

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

当我想将我的“文件名(1)”减少到“文件名”时,解决我的问题真是太棒了。
我只是将脚本修改为:

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

它确实解决了麻烦的体力劳动。