如何用PowerShell编写脚本提取文件名、格式化名称并生成对应CSV?
PowerShell 文件重命名预处理脚本实现与解析
需求拆解
- 用
Get-ChildItem获取指定路径下的文件 - 提取文件名中
@符号前的内容(如andrea.figuera@gmail.com.pst提取andrea.figuera) - 格式转换:首字母及句号后的字母大写(
andrea.figuera→Andrea.Figuera),再去除句号(Andrea.Figuera→AndreaFiguera) - 生成包含
FileName(原文件名)和Name(转换后名称)的CSV文件,用于后续重命名
完整脚本实现
# 指定目标路径 $targetPath = "C:\Your\Target\Path" # 获取文件并处理每个对象 Get-ChildItem -Path $targetPath -File | ForEach-Object { # 正则匹配@前的内容 if ($_.BaseName -match '^(.*?)@') { $extractedName = $matches[1] # 首字母及句号后字母大写 $capitalizedName = $extractedName -replace '^(.)|(\.\w)', { if ($args[0].Groups[1].Success) { $args[0].Groups[1].Value.ToUpper() } else { $args[0].Groups[2].Value.Substring(1).ToUpper() } } # 去除句号 $finalName = $capitalizedName -replace '\.', '' # 输出对象供CSV生成 [PSCustomObject]@{ FileName = $_.Name Name = $finalName + $_.Extension } } } | Export-Csv -Path "$targetPath\RenameMap.csv" -NoTypeInformation -Encoding UTF8
关键命令解析
1. 正则匹配@前内容
$_.BaseName -match '^(.*?)@'
^(.*?)@:^匹配字符串开头,.*?是非贪婪匹配,会捕获从开头到第一个@的所有内容,避免文件名含多个@时匹配错误- 匹配成功后,结果存于
$matches[1]中,这就是需要提取的核心内容
2. 大小写转换逻辑
$capitalizedName = $extractedName -replace '^(.)|(\.\w)', { ... }
- 正则
^(.)|(\.\w):同时匹配两个模式:^(.):字符串的第一个字符(\.\w):句号后跟的单个字母数字字符
- 脚本块
{ ... }:对每个匹配项做针对性处理:- 如果匹配的是字符串首字符(
Groups[1]匹配成功),直接转大写 - 如果匹配的是句号后的字符(
Groups[2]匹配成功),跳过句号本身,将后续字符转大写
- 如果匹配的是字符串首字符(
3. 生成CSV文件
[PSCustomObject]@{ ... } | Export-Csv ...
[PSCustomObject]构造自定义对象,明确包含原文件名和转换后的新文件名两个字段Export-Csv将对象集合导出为CSV文件,-NoTypeInformation避免生成PowerShell类型信息行,-Encoding UTF8确保特殊字符正常显示
验证与注意事项
- 单独测试正则匹配:运行
"andrea.figuera@gmail.com" -match '^(.*?)@'; $matches[1],确认提取结果正确 - 测试大小写转换:运行
"andrea.figuera" -replace '^(.)|(\.\w)', { if ($args[0].Groups[1].Success) { $args[0].Groups[1].Value.ToUpper() } else { $args[0].Groups[2].Value.Substring(1).ToUpper() } },查看转换效果 - 生成CSV后先核对内容,确认无误后,可结合
Import-Csv和Rename-Item实现自动批量重命名
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

