如何用PowerShell去除文件名首尾空格?代码报错求助
问题背景
我想要对存在首尾空格的文件名执行trim()操作,使用了以下PowerShell代码:
$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
明明代码找到了需要重命名的文件,却提示文件不存在,该怎么解决?
问题原因
当你直接把$_(Get-ChildItem返回的FileInfo/DirectoryInfo对象)传给Rename-Item的-Path参数时,PowerShell会自动将其转换为字符串,但这个字符串只包含文件名(比如 test.txt),不是完整路径。而PowerShell默认会在当前工作目录下查找这个文件,自然找不到存在于桌面的文件。
另外,即使你用了完整路径,-Path参数会把空格当作路径分隔符的一部分来解析,对于首尾带空格的文件名,也容易出现解析错误。
解决方案
有两种可靠的修改方式:
方式1:使用FullName属性传入完整路径
FileInfo对象的FullName属性会返回文件的完整绝对路径,直接用它作为-Path参数的值就能确保PowerShell找到正确的文件:
$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 $_.FullName -NewName $newName } } }
方式2:使用-LiteralPath参数(更推荐)
-LiteralPath参数会原样解析传入的路径字符串,不会把空格当作分隔符处理,对于带特殊字符(包括首尾空格)的路径更安全。结合$_本身(PowerShell会自动把FileInfo对象转换为其FullName字符串传入-LiteralPath):
$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 -LiteralPath $_ -NewName $newName } } }
验证测试
运行修改后的代码后,桌面的 test.txt会被成功重命名为test.txt,不会再出现“文件不存在”的错误。
内容的提问来源于stack exchange,提问作者MysteriousMuffins

