我遇到了我之前已经多次解决的问题,但是我对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上的错误是否已修复?
谢谢!
答案 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'}