如何使用Powershell重命名带方括号的文件?

时间:2016-01-11 20:35:54

标签: powershell

没有尝试做任何激烈的事情,但我正在从mp3标题标签重命名我的音乐文件。 遇到这个问题的文件: -

$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"

我收到错误: - 重命名项目:无法重命名,因为'F:\ Music \ Queen \ Live Magic \ One Vision [来自电影铁鹰] .mp3'中的项目不存在。

文件存在!

如果在没有区分大小写的情况下查看文件是相同的话,我会通过tmp.mp3。

该代码适用于没有方括号的文件,因此很明显Powershell正在逐字逐句地使用它们。

我确实尝试用Move-Item替换Rename-Item,但是我得到了类似的错误。

感谢任何帮助。

4 个答案:

答案 0 :(得分:6)

-LiteralPath知道如何处理特殊字符 试试这个:

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

答案 1 :(得分: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}

测试输出

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

答案 2 :(得分:0)

从您的评论到我收集的其他答案,您使用的是PowerShell v2。

现在,PowerShell v2中的Rename-Item cmdlet似乎没有-LiteralPath参数,您需要这些参数才能正确解释包含特殊字符(如方括号)的路径。

Rename-Item的另一个cmdlet是Move-Item,即使在PowerShell v2中,(好奇地) 支持-LiteralPath参数。

而不是:

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

尝试:

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

在您提出的问题中,您已尝试Move-Item而不是Rename-Item。但您是否尝试Move-Item-LiteralPath结合使用?

答案 3 :(得分:0)

class ErrorPage extends CI_Controller { public function index() { $this->load->view('404page.php'); } } 方法有效:-)我还发现通过使用move-item -literalpath $var1 -destination $var2,我可以根据需要重命名文件,而无需通过tmp文件。后来的测试证明[System.IO.File]::Move( "$mp3path$fyl" , "$mp3path$track_title.mp3")方法也不需要临时文件。