Powershell重命名 - 具有特殊字符的项目问题

时间:2013-12-31 00:36:58

标签: powershell

我遇到了我之前已经多次解决的问题,但是我对PS脚本或正则表达式并不太熟悉,而且我很难在这里实现修复。

基本上,如果我的剧本这一行能起作用,我会很高兴:

Get-childItem *.* -recurse -force | % {rename-item $_.name ($_.name -replace '(\d{2}) \[(\d{1})x(\d{2})\]','$1 s0$2e$3')}

示例文件名将是“24 [1x01] .avi”,而应该命名为“24 s01e01.avi” - 我正在尝试整理我的媒体收藏:)

我知道它不是文件名中的方括号。我想我必须将文件移动到临时位置,在执行此操作时更改名称,然后再移回。我的困难在于,我无法使用正则表达式找到这样的示例,但我无法使其正常工作。

此外,还有比这更好的解决方法吗? Microsoft Connect上的错误是否已修复?

谢谢!

4 个答案:

答案 0 :(得分:2)

我认为你的正则表达式对你来说更有意义,特别是作为初学者,如果你使用“命名组”(正则表达式概念)。我已经稍微修改了你的正则表达式以考虑到这一点。您应该真正熟悉正则表达式术语,以确保您可以更新正则表达式以适用于所有场景。

"24 [1x01].avi" -replace '(?<ShowName>.*) \[(?<Season>\d{1})x(?<Episode>\d{2})\]','${ShowName} s0${Season}e${Episode}';

结果:

24 s01e01.avi

你能给出一个不起作用的文件名的例子吗?

编辑:附加示例脚本。如果这对您有用,请告诉我。

# 1. Define a test folder path
$RootPath = "$env:SystemDrive\test";
# 2. Create the folder
mkdir -Path $RootPath;
# 3. Create a test file
Set-Content -Path "$RootPath\24 [1x01].txt" -Value '';
# 4. Get a list of files in the directory
$FileList = Get-ChildItem -Path $RootPath;

foreach ($File in $FileList) {
    # 5. Fix up the name of each file
    $NewName = $File.Name -replace '(?<ShowName>.*) \[(?<Season>\d{1})x(?<Episode>\d{2})\]','${ShowName} s0${Season}e${Episode}';
    # 6. Rename the file
    Move-Item -Path $File.FullName -Destination ((Split-Path -Path $File.FullName -Parent) + $NewName);
}

答案 1 :(得分:1)

powershell Rename-Item fail to rename

如果您运行的是PS 3+,请添加-LiteralPath开关以重命名:

答案 2 :(得分:1)

处理文件名中特殊字符(例如方括号/大括号[])的最简单方法之一就是简单地使用-LiteralPath参数。

错误::尝试重命名包含方括号/ [[]]的文件或文件夹时,PowerShell返回的标准错误消息是“找不到文件”,这是不正确的。

原因:不幸的是,Windows仍使用老式的8.3格式的短文件名(最多8个字符,允许的字符数有限),PowerShell的-Path参数(即使在5.1版中)也使用这些内部名称。

解决方案:使用-LiteralPath参数,该参数适用于大多数cmdlet(包括Get-ChildItem或Rename-Item等)

示例:描述处理包含方括号/ [[]]的文件或文件夹:

Get-ChildItem -LiteralPath "test[1].txt";
Test-Path -LiteralPath "C:\dir\test[1].txt";
Rename-Item -LiteralPath "test[1].txt"  "test[2].txt";

注意:在PowerShell 3.0以下的版本中,要重命名包含特殊字符的文件/目录,请使用Move-Item-LiteralPath而不是Rename-Item cmdlet,因为{ {1}}在PS 2.0版(或更低版本)中没有Rename-Item

答案 3 :(得分:0)

感谢@Trevor Sullivan的指示,我能够通过以下方式获得理想的结果:

  • 更新到最新版本的PowerShell(评论中提供的下载链接)

  • 将脚本编辑为以下内容:

    Get-childItem *.* -recurse -force | Move-Item -Destination {$_ -replace '(\d{2}) \[(\d{1})x(\d{2})\]','$1 s0$2e$3'}