使用PowerShell递归删除/重命名文件

时间:2016-06-23 17:19:10

标签: powershell

我必须浏览多个级别的子文件夹并删除在SharePoint中无效的特殊字符,主要是“#&”

我在互联网上搜寻不同的命令; rename-item / move-item,两者的变化,都无济于事。我最接近的是使用:

Get-ChildItem -Recurse | Rename-Item -NewName {$_.Name -replace'[!@#&]','_'}

但我不断收到此错误:重命名项:源和目标路径必须不同。

有人能指出我正确的方向吗?

此致

3 个答案:

答案 0 :(得分:2)

当您尝试将目录重命名为与当前名称相同的NewName时,只会发生该错误,您可以放心地忽略它。

添加-ErrorAction SilentlyContinue以静默方式禁止显示错误消息:

Get-ChildItem -Recurse | Rename-Item -NewName {$_.Name -replace'[!@#&]','_'} -ErrorAction SilentlyContinue

答案 1 :(得分:0)

您需要过滤掉您不打算重命名的文件:

Get-ChildItem -Recurse |
    Where-Object { $_.Name -match '[!@#&]' } |
    Rename-Item -NewName {$_.Name -replace '[!@#&]','_'}

答案 2 :(得分:0)

这样的事情可能会起作用

dir -Recurse -File | ? basename -Match '[!@#&]' | % {
    # if the file.txt already exists, rename it to file-1.txt and so on
    $num = 1
    $base = $_.basename -replace'[!@#&]', '_'
    $ext = $_.extension
    $destdir = Split-Path $_.FullName
    $newname = Join-Path $destdir "$base$ext"
    while (Test-Path $newname) {
        $newname = Join-Path $destdir "$base-$num$ext"
        $num++
    }

    ren $_.fullname $newname
}