如何使用 PowerShell 删除文件名中的前导或尾随空白 space?

How do I remove a leading or trailing blank space in file name with PowerShell?

我基本上是在尝试 trim() 任何名称末尾有前导或尾随 space 的文件名。这是我目前得到的代码

$foldersToCheck = "$env:userprofile\documents", "$env:userprofile\pictures", "$env:userprofile\desktop"
foreach ($folder in $foldersToCheck) {
    get-childitem -path $folder -recurse | foreach-object {
        if ($_.name.startswith(" ") -or $_.name.endswith(" ")) {
            $newName = $_.name.trim()
            rename-item -path $_ -newName $newname
        }
    }
}

如果我创建了一个测试文件 (c:\users\someusername\desktop\test.txt),然后我收到这个错误

rename-item : Cannot rename because item at ' test.txt' does not exist.
    At line:6 char:13
    +             rename-item -path $_ -newName $newname
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
        + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

所以,看起来它找到了需要重命名的文件,但后来说它不存在。

这里的问题是 PowerShell 在尝试将文件名转换为可以绑定到 -Path 的字符串时将 $_ 解析为文件名。

显式传递文件的完整路径,它将起作用:

Rename-Item -Path $_.FullName -NewName $newname

或者,将 $_ 文件对象通过管道传输到 Rename-Item,PowerShell 将自动确定它需要将 $_.FullName 绑定到 Rename-Item-LiteralPath参数:

$_ |Rename-Item -NewName $newname

您还可以将整个循环变成单个管道,然后利用 pipeline-bound 表达式对 -NewName:

$foldersToCheck |Get-ChildItem -Recurse |Rename-Item -NewName { $_.Name.Trim() }

如果现有的 Name-NewName 值相同,Rename-Item 无论如何都会保留文件 :)