Как мне удалить начальный или конечный пробел в имени файла с помощью PowerShell?

#powershell #trim

#powershell #обрезать

Вопрос:

Я в основном пытаюсь обрезать () любые имена файлов, у которых есть начальный или конечный пробел в конце имени. Это код, который у меня есть на данный момент

 $foldersToCheck = "$env:userprofiledocuments", "$env:userprofilepictures", "$env:userprofiledesktop"
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:userssomeusernamedesktop 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
  

Итак, похоже, что он нашел файл, который необходимо переименовать, но затем говорит, что он не существует.

Ответ №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 все равно просто оставим файлы в покое 🙂

Комментарии:

1. Сработало как шарм. Спасибо!

2. @MysteriousMuffins Отлично, добро пожаловать! Я также добавил пример с одним конвейером, если это поможет 🙂