#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 Отлично, добро пожаловать! Я также добавил пример с одним конвейером, если это поможет 🙂