【问题标题】:How do I remove a leading or trailing blank space in file name with PowerShell?如何使用 PowerShell 删除文件名中的前导或尾随空格?
【发布时间】:2020-09-09 14:30:42
【问题描述】:

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

$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 trim


    【解决方案1】:

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

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

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

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

    $_ |Rename-Item -NewName $newname
    

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

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

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

    【讨论】:

    • 工作就像一个魅力。谢谢!
    • @MysteriousMuffins 太好了,不客气!如果有帮助,我还添加了一个单管道示例:)
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多