当路径中有方括号时,PowerShell会出现奇怪的行为。例如,如果您在文件夹中:
C:\Some Movie [2011]
包含mkv
文件并输入:
ls *.mkv
什么都没有回复!我认为问题在于PowerShell尝试执行以下操作:
Get-ChildItem 'C:\Some Movie [2011]\*.mkv'
失败,因为[2011]
被视为通配符。我可以使用以下命令从这样的文件夹中检索所有mkv
:
Get-ChildItem -LiteralPath 'C:\Some Movie [2011]' -Include *.mkv
但是当我尝试在Rename-Item命令中提供这些结果时,它会失败。
Get-ChildItem -LiteralPath 'C:\Some Movie [2011]' -Include *.mkv | Rename-Item -NewName "movie.mkv"
没有括号的文件夹中的相同操作运行没有问题。有什么想法吗?
答案 0 :(得分:7)
请参阅我对您的问题的评论(上图)。如果您希望在该文件夹中只有一个mkv文件,这将工作。 Rename-Item
不支持LiterlPath(在v3中修复),您可以使用.NET。我还建议(当您只过滤一个扩展名时)使用-Filter而不是Include时,它的执行速度会更快。
Get-ChildItem -LiteralPath 'D:\Some Movie [2011]' -Filter *.mkv | Foreach-Object{
$NewName = Join-Path -Path $_.DirectoryName -ChildPath 'movie.mkv'
[System.IO.File]::Move($_.FullName,$NewName)
}
答案 1 :(得分:4)
Rename-Item cmdlet that doesn't handle filenames with brackets中存在一个已知错误。在链接中,向下滚动到“2010年1月29日由Microsoft发布”。
解决方法是使用Move-Item cmdlet,因为Move-Item具有“-LiteralPath”选项。但问题是,它显然只有在目录名称不包含括号的情况下才有效,这听起来不像是对你的情况有帮助。
我不确定,但你可以尝试类似DOS(cmd)的东西。否则,你可能会被迫在.Net语言中执行重命名,因为你肯定可以在那里工作。
看起来微软几天前刚刚发布了Powershell 3.0。没有承诺,但您可以尝试安装它,看看他们是否设法修复了错误。