2016-01-11 5 views
0

Не пытайтесь сделать что-либо решительное, но я переименовываю свои музыкальные файлы из тегов заголовков mp3. Наткнулся файл этой проблемы: -Как переименовать файл с квадратными скобками с помощью Powershell?

$fyl = One Vision [From the Motion Picture Iron Eagle].mp3 

$tmp = "tmp.mp3" 

$track_title = One vision [From the motion picture Iron Eagle] 

rename-item "$mp3path$fyl" -newname "$mp3path$tmp" 

rename-item "$mp3path$tmp" -newname "$mp3path$track_title.mp3" 

Я получаю ошибку: - Rename-Item: Невозможно переименовать, потому что пункт на «F: \ Музыка \ Queen \ Живая Магия \ One Vision [Из Кинофильма Iron Eagle] .mp3 'не существует.

Файл существует!

Я просматриваю tmp.mp3 в случае, если файлы одинаковы, если смотреть без чувствительности к регистру.

Код работает с файлами без квадратных скобок, поэтому, очевидно, Powershell воспринимает их буквально.

Я попытался заменить Rename-Item на Move-Item, но получаю схожие ошибки.

Любая помощь приветствуется.

+0

Быстрое предложение попробовать, попробовали ли вы экранировать символы квадратной скобки? '$ fyl = One Vision \ [From the Motion Picture Iron Eagle \]. Mp3' – Gnarlywhale

+1

Я не замечаю никаких кавычек на строках, как правило, они должны быть указаны (одинарные кавычки, если вы не хотите убегать. –

+1

Возможный дубликат из [Как получить доступ к путям файлов в Powershell, содержащим специальные символы?] (http://stackoverflow.com/questions/12090312/how-to-access-file-paths-in-powershell-containing-special-characters) – Matt

ответ

4

-LiteralPath знает, как обрабатывать специальные символы попробовать это:

Rename-Item -LiteralPath C:\[filename].txt -NewName filename.txt 
+0

Просто использовал параметр -LiteralPath, но он все еще не смог переименовать файл. следующее: - Переименовать- Элемент: Не удается найти параметр, который соответствует имени параметра «LiteralPath» Powershell - Major 2, minor 0, build -1, revision -1 –

+0

Можете ли вы установить powershell v4.0? Это должно исправить это –

0

Я могу новый, переименовать, удалить, и получить такие файлы.

Этот скрипт должен работать и для вас, и, возможно, вы можете использовать его для отладки вашего скрипта.

Обратите внимание, что я использую Join-Path по привычке и передовой практике, чтобы гарантировать, что пути действительны.

Код проверки:

$mp3dir = "d:\test" 
$fyl = "One Vision [From the Motion Picture Iron Eagle].mp3" 
$tmp = "tmp.mp3" 
$track_title = "One vision [From the motion picture Iron Eagle]" 
New-Item -Path $mp3dir -Name $fyl -ItemType file -Force | Out-Null 
$found = Get-ChildItem -Path $mp3dir -Filter *.mp3 
"Found1:" 
$found | % {$_.FullName} 
Remove-Item $(Join-Path $mp3dir $tmp) -ErrorAction SilentlyContinue 
Rename-Item -LiteralPath $(Join-Path $mp3dir $fyl) -NewName $tmp -Force 
$found = Get-ChildItem -Path $mp3dir -Filter *.mp3 
"Found2:" 
$found | % {$_.FullName} 
$newName = $(Join-Path $mp3dir $($track_title + ".mp3")) 
"New name:`n$newName" 
Remove-Item $(Join-Path $mp3dir $newName) -ErrorAction SilentlyContinue 
Rename-Item -LiteralPath $(Join-Path $mp3dir $tmp) -NewName $newName -Force 
$found = Get-ChildItem -Path $mp3dir -Filter *.mp3 
"Found3:" 
$found | % {$_.FullName} 

Test Output

Found1: 
D:\test\One Vision [From the motion picture Iron Eagle].mp3 
Found2: 
D:\test\tmp.mp3 
New name: 
d:\test\One vision [From the motion picture Iron Eagle].mp3 
Found3: 
D:\test\One vision [From the motion picture Iron Eagle].mp3 
+0

Пробовал ваш скрипт, но я получаю ошибку, подобную выше, где он жалуется на Rename-Item: Невозможно найти параметр, который соответствует имени параметра «LiteralPath». Я буду продолжать пытаться заставить это работать. Возможно, мне нужно обновить мою Powershell? –

+0

Что такое вывод из '$ PSVersionTable'? –

0

От ваших комментариев к другим ответам я понимаю, что вы используете PowerShell v2.

Теперь командлет Rename-Item в PowerShell v2 не имеет параметра -LiteralPath, который необходим для правильной интерпретации пути, содержащего специальные символы, такие как квадратные скобки.

Альтернативный командлет Rename-Item является Move-Item, который (странно) делает поддержку параметр -LiteralPath даже в PowerShell v2.

Вместо:

rename-item "$mp3path$fyl" -newname "$mp3path$tmp" 

попробовать:

Move-Item -LiteralPath "$mp3path$fyl" -Destination "$mp3path$tmp" 

В вашем вопросе вы сказали, что вы уже пробовали Move-Item вместо Rename-Item. Но вы пробовали Move-Item в сочетании с -LiteralPath?

0

Метод move-item -literalpath $var1 -destination $var2 работал :-) Я также обнаружил, что с помощью [System.IO.File]::Move("$mp3path$fyl" , "$mp3path$track_title.mp3") мне удалось переименовать файл, как я хотел, без необходимости прохождения через tmp-файл. Позже тестирование показало, что для метода move-item -literalpath также не нужен временный файл.

Смежные вопросы