我基本上是想修剪()名称末尾带有前导或尾随空格的任何文件名。这是我到目前为止的代码
$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转换为可以绑定到的字符串时,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
则无论如何都将不理会这些文件:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句