Странное поведение с помощью скобок в пути

В 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

но когда я пытаюсь передать эти результаты в команде "Переименовать-элемент", это не сработает.

Get-ChildItem -LiteralPath 'C:\Some Movie [2011]' -Include *.mkv | Rename-Item -NewName "movie.mkv"

Те же операции в папке без скобок выполняются без проблем. Любые идеи?

Ответ 1

Смотрите мой комментарий по вашему вопросу (см. выше). это будет работать, если вы ожидаете, если в этой папке будет только один файл mkv. Rename-Item не поддерживает LiterlPath (исправлено в версии 3), вы можете прибегнуть к .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)
}

Ответ 2

Там известна ошибка в командлете Rename-Item который не обрабатывает имена файлов с помощью скобок. В ссылке прокрутите вниз до раздела "Отправлено Microsoft на 01/29/2010".

В процессе работы вместо этого используется командлет Move-Item, поскольку Move-Item имеет параметр "-LiteralPath". Однако уловка состоит в том, что он работает, только если имя каталога не содержит скобок, что не похоже на то, что это поможет вашему делу.

Я не уверен, но вы можете попробовать что-то подобное из DOS (cmd). В противном случае вы можете столкнуться с выполнением переименований с языка .NET, поскольку вы могли бы определенно заставить его работать там.

Похоже, что Microsoft только что выпустила Powershell 3.0 несколько дней назад. Нет promises, но вы можете попробовать установить это и посмотреть, удалось ли устранить ошибку.