我有一个文件夹,其中列出了该文件夹内的所有电影,格式如下。
- [1979] 电影名称 [P1] - 迪士尼
- [1979] 电影名称 [P1][导演版] - PTC
- [1980] 电影名称 [P8][导演版] - 测试
我想获取该文件夹中的所有电影并浏览它们并将它们放入三个不同的属性中年份、名称、工作室
所有这些信息将保存到电影的单个文件名中
这就是我将信息保存到文件的方法
Name of the movie [P1]
1979
Disney
或者
Name of the movie [P1][Director Edition]
1979
PTC
我尝试编写此代码
$regex = [regex]"\[(\w+)\](\w+\[\w+\])-(\w+)"
$name = "[TEST]TEST[TEST]-TEST"
$tokens = $regex.Match($name).groups[1,2,3] | Select -ExpandProperty Value
它工作正常,但是当我像这样运行时,但当我循环运行时它不起作用。
$name = dir *.mp4 | select BaseName
$regex = [regex]"\[(\w+)\](\w+\[\w+\])-(\w+)"
foreach ($n in $name)
{
$file_name = $n.BaseName.ToString();
$year, $title, $studio = $regex.Match($file_name).groups[1,2,3] | Select -ExpandProperty Value
}
答案1
抱歉,我不是正则表达式专家;但是,我可以提供我的基本尝试:
$name = dir *.mp4 | select BaseName ### no such files; see next herestrig workaround:
$name = @'
[year]TEST2[TEST3]-TEST4
[1979] Name of the movie [P1] - Disney
[1979] Name of the movie [P1] [Director's Cut] - PTC
[1980] Name of the movie [P8][Director Edition] - Test Studios
'@ -split [System.Environment]::NewLine
$regex = [regex]"\[(\w+)\](\w+\[\w+\])-(\w+)" # wrong: original
$regex = [regex]"\[(\w+)\]([\s*\w]+[\s*\[\w+\]]+)\s*-\s*(\w+)" # wrong: Apostrophe
$regex = [regex]"\[(\w+)\]\s*(\w+[\s*\[\w+'*\]]+?)\s*\-\s*([\s*\w+]+)" # works
$regex = [regex]"\[(\w+)\]\s*(\w+[\s*\[\w+'*\]]+?)\s*\-\s*(.*$)" # works
foreach ($n in $name)
{
$file_name = $n #.BaseName.ToString();
$year, $title, $studio = $regex.Match($file_name).groups[1,2,3] |
Select -ExpandProperty Value
"$year,$title,$studio," ### debugging output
}
输出:
PS D:\PShell> D:\PShell\SU\1298893.ps1
year,TEST2[TEST3],TEST4,
1979,Name of the movie [P1],Disney,
1979,Name of the movie [P1] [Director's Cut],PTC,
1980,Name of the movie [P8][Director Edition],Test Studios,