PowerShell技术问询:如何在Excel列中按指定格式输出文件名且不重命名原文件
解决PowerShell中文件名格式转换并写入Excel的问题
没问题,我来帮你搞定这个文件名格式转换的需求!你不需要修改原文件,只需要在写入Excel时对文件名做字符串处理就行,核心是从现有文件名里拆分出需要的两部分,再调换顺序拼接。
思路分析
你的文件名格式是ABxxxx.yyy(xxxx是4位数字,yyy是3位扩展名),目标格式是yyy-xxxx,所以我们需要:
- 提取扩展名(去掉开头的
.) - 提取Basename中AB后面的4位数字
- 把这两部分用
-连接起来
方法一:字符串截取(适合固定前缀的情况)
如果你的文件名都是AB开头的固定格式,直接用字符串截取最直接:
# 记得先初始化行号,比如从第2行开始(假设第1行是表头) $i = 2 ForEach ($file in $files){ $location = Join-Path $root $file # 推荐用Join-Path代替字符串拼接,避免路径分隔符问题 # 处理文件名格式 $ext = $file.Extension.TrimStart('.') # 获取扩展名并去掉开头的点,比如从".123"得到"123" $numPart = $file.BaseName.Substring(2, 4) # 从Basename的第3个字符开始取4位(AB后面的四位数字) $formattedFileName = "$ext-$numPart" $column = 1 $workbook.Cells.Item($i, $column) = $formattedFileName $i++ # 递增行号,避免所有内容写到同一行 }
方法二:正则表达式(更灵活的格式匹配)
如果以后文件名前缀可能变化,但整体结构还是[前缀][4位数字].[3位数字],用正则表达式匹配会更健壮:
$i = 2 ForEach ($file in $files){ $location = Join-Path $root $file # 用正则匹配文件名,捕获4位数字和3位扩展名 if ($file.Name -match '^AB(\d{4})\.(\d{3})$') { # 调换捕获组的顺序,拼接成目标格式 $formattedFileName = "$($matches[2])-$($matches[1])" } else { # 遇到不符合格式的文件,可以设置默认显示值或者跳过 $formattedFileName = $file.Name Write-Warning "文件名 $($file.Name) 不符合格式,已使用原名称" } $column = 1 $workbook.Cells.Item($i, $column) = $formattedFileName $i++ }
小提醒
- 别忘了初始化并递增
$i,不然所有文件的名称都会写到Excel的同一行里 - 用
Join-Path拼接路径比直接用+更可靠,能自动处理不同系统的路径分隔符问题
内容的提问来源于stack exchange,提问作者Olbrok
相关产品推荐
相关产品推荐

