PowerShell重命名项目失败

11

我的PowerShell脚本:

$dst = 'C:\Temp'

#Get all folders in $dst
$folders = Get-ChildItem $dst | ?{ $_.PSIsContainer }

foreach($folder in $folders)
{
    $cnt = (Get-ChildItem -filter *.txt $folder | Measure-Object).Count

    $base = ($folder.FullName -split " \[.*\]$")[0]
    $newname = $("{0} [{1}]" -f $base,$cnt)

    Write-Host $folder.FullName "->" $newname

    Rename-Item $folder.FullName $newname
}

问题

第一次运行时,我遇到了这个:

PS C:\Temp> C:\Temp\RenameFolders.ps1
C:\Temp\m1 -> C:\Temp\m1 [1]

在我的第二次运行中,我得到了这个:

PS C:\Temp> C:\Temp\RenameFolders.ps1
C:\Temp\m1 [1] -> C:\Temp\m1 [0]
Rename-Item : Cannot rename because item at 'C:\Temp\m1 [1]' does not exist.
At C:\Temp\RenameFolders.ps1:15 char:5
+     Rename-Item $folder.FullName $newname
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

我知道问题出在 '[' 和 ']' 上,但我真的不明白为什么。

有人能解释一下为什么会出现这个问题吗?


你的文件夹结构在之前和之后是什么样子?你期望发生什么事情? - user189198
正如你在我的例子中看到的...开始名称:"C:\Temp\m1",重命名后:"C:\Temp\m1 [1]",第二次运行后...开始名称:"C:\Temp\m1 [1]",重命名为:"C:\Temp\m1 [0]" <- 这一步失败了 - Wolfy
1个回答

31

如果您正在运行PS 3+,请在重命名时添加-LiteralPath开关:

Rename-Item -LiteralPath $folder.FullName $newname
否则使用 Move-Item
Move-Item -LiteralPath $folder.FullName $newname

Powershell在文件名中不喜欢方括号,详见此帖:

这是V2版本的一个问题,因为他们将方括号添加到通配符字符集以支持“blobbing”。

参见get-help about_wildcards:

Windows PowerShell支持以下通配符字符:

通配符字符 描述 示例 匹配 不匹配


  • 匹配零个或多个字符 a* A、ag、Apple banana

    ? 在指定位置上仅匹配一个字符 ?n an、in、on ran

    [ ] 匹配指定范围内的字符 [a-l]ook book、cook、look took

    [ ] 匹配指定字符 [bc]ook book、cook hook

[] 是特殊字符。


非常感谢!-LiteralPath 对我来说完美无缺。为什么? - CodyBugstein
请参阅上文:“...当V2添加方括号以支持“blobbing”时,这成为了一个问题。” - Raf
非常感谢!文件名中的方括号让我彻底混乱了!使用LiteralPath解决了我的问题! - Mikael Dyreborg Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接