Странное поведение с помощью скобок в пути
В 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, но вы можете попробовать установить это и посмотреть, удалось ли устранить ошибку.