尝试用一项新技术解决一个小问题
问题
如何管理视频资源?最简单的手工方式:单独的MP4格式文件按一定规律重命名后,放入一个目录下。当资源超过数百个的时候,很难继续。况且就算能保证手工录入准确,也不方便。
演员 1-3位大小写字母 一或零个连字符 3-4位数字 标题
1.分析
因此,考虑使用一个数据库。首先观察键值,在录入时,有一些没有连字符 有一些用了小写 有一些演员没有写 有一些标题没有写
* MIAA207 *
* IPX647 *
* miaa-795 *
虽然外部数据中,通常直接用大写字母连字符数字,考虑数据关系,应该使用两个键分开存储便于检索。需要使用时进行拼接即可,这样对于不使用连字符的数据也很方便支持。
2.实现
分析过后,很容易判断出需要使用的特性
- 获取目录项
- 正则表达式捕获子表达式
- 导出数据
在AI广泛免费使用的时代,该需求很容易会得到一段Python代码。有什么理由找一项新技术去完成呢?
- 尽可能原生摆脱依赖,虽然当前Python环境在绝大多数平台上都是可移植的。
- 尽可能简单实现,能快速修改复用。个人计算机操作系统几乎都提供了一个命令行环境,但是CMD、Shell等环境面向文本,在可拓展性上差强人意,添加新功能相当麻烦。
- 探索新技术
这就是使用powershell的原因,在Windows上从Win7就附带了,新的pwsh是跨平台的。
更重要的是,它是对象模型的,命令之间传递的是带有方法的结构化数据对象。直接命令和脚本的语法是一致的,意味着编写时可以不断运行逐步修改,完成后完整命令就是一段脚本
3.完成
传统上有两个命令用于列出目录 ls dir
powershell中这两个命令输出是相同的,事实上都是 Get-ChildItem 。
man 命令可以验证这一点,ma nman 发现是 Get-Help 的别名
man dir
> man dir
名称
Get-ChildItem
语法
Get-ChildItem [[-Path] <string[]>] [[-Filter] <string>] [<CommonParameters>]
Get-ChildItem [[-Filter] <string>] [<CommonParameters>]
别名
gci
ls
dir
- Mode
- LastWriteTime
- Length
- Name
管道中传递的是对象,对象成员包括属性和方法,那么检查类型成员的命令显而易见
Get-ChildItem | Get-Member
System.IO.FileInfo 类型成员很多,但只需要 Name 用于正则表达式即可。考虑这一点,看看有什么命令,虽然直接搜索带有 match 选项的命令也可以,但更方便的方式是使用搜索引擎。
发现一个命令>Where-Object用于 根据集合的属性值从集合中选择对象 。
同样地, Select-Object 构造新对象 Export-Csv 导出用于数据导入 ,足够了。
Where-Object
很容易尝试出匹配出适用的文件名 Property选项指定 name 属性 Match 进行匹配,可以发现 powershell默认行为为大小写不敏感。
文档中CaseSensitiveMatchSet 使用 -CMatch 。
Get-ChildItem| where -Property name -Match "([A-Z]{3,4})-?(\d{3,4})"
下一步,根据Select-Object文档用逗号分隔, @{} 表示新键值对,其中 Name 表示属性名,Expression 表示值。
直接使用AI获得结果即可。
Select-Object
Select-Object -Property Name,
@{Name="字母段"; Expression={$matches[1]}},
@{Name="数字段"; Expression={$matches[2]}}
-Encoding UTF8 -NoTypeInformation
解决
Get-ChildItem| where -Property name -Match "([A-Z]{3,4})-?(\d{3,4})" |
Select-Object -Property Name,
@{Name="字母段"; Expression={$matches[1]}},
@{Name="数字段"; Expression={$matches[2]}} |
Export-Csv -Path "test.csv" -Encoding UTF8 -NoTypeInformation
最后可以用Import-Csv 检查结果
Import-Csv .\test.csv

浙公网安备 33010602011771号