路径中括号的奇怪行为

时间:2011-12-26 14:04:44

标签: powershell path

当路径中有方括号时,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"

没有括号的文件夹中的相同操作运行没有问题。有什么想法吗?

2 个答案:

答案 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。没有承诺,但您可以尝试安装它,看看他们是否设法修复了错误。