如何使用powershell从文件名中删除[*]

vcirk6k6  于 2023-10-23  发布在  Shell
关注(0)|答案(1)|浏览(106)

我试过下面的脚本,但它跳过[任何]

$rootDirectory = "C:\Path\To\Your\Root\Directory"

Get-ChildItem -Path $rootDirectory -File -Recurse | ForEach-Object {
    $newName = $_.Name -replace '[\[\]]', ''
    
    if ($newName -ne $_.Name) {
        $newPath = Join-Path -Path $_.Directory.FullName -ChildPath $newName
        Rename-Item -Path $_.FullName -NewName $newName -Force
        Write-Host "Renamed $($_.FullName) to $newPath"
    }
}

请帮我

mu0hgdu0

mu0hgdu01#

你的问题是什么并不明显,但让我推荐以下方法,这可能会解决你的问题:

  • 为了简洁和高效,使用延迟绑定脚本块。
  • 使用-WhatIf公共参数来 * 预览 * 操作(如下所示)。
  • 使用公共-Verbose参数使Rename-Item将重命名项的完整路径打印到详细output stream
Get-ChildItem -Path $rootDirectory -File -Recurse |
  Rename-Item { $_.Name -replace '[][]' } -WhatIf

注意事项:

  • -replace '[][]'-replace '[\[\]]', ''操作的简化版本;它有效地从输入文件名中删除了[]的任何示例,例如,foo[bar].txt变成了foobar.txt
  • 由于使用-File限制重命名 * 文件 *:
  • 如果-replace操作没有效果,即如果输入文件名不包含[],则重命名操作是良性的无操作,因此可以安全使用上述操作。
  • 然而,不幸的是,这将不适用于 * 目录 *(如果您忽略-File并且子目录存在,或者如果您仅使用-Directory处理目录),从PowerShell(Core)7.3.8开始:
  • GitHub issue #14903是一个解决这个不幸的不对称性的绿灯建议,但到目前为止还没有人加强实施它。

相关问题