PowerShell如何从文件路径提取无扩展名文件名、匹配最后一个.的位置
PowerShell 多点点文件名无后缀提取方案
现有代码错误原因
- 调用
LastIndexOf(".")后加了[0]:LastIndexOf返回的是最后一个.对应的整数索引值,不是数组,加[0]会直接抛出索引无效错误 - 循环逻辑错误:
foreach($x in $filename)中$filename在循环首次执行前未定义,循环内部重复给$filename赋值完全多余 - 手动分割反斜杠的路径处理方式兼容性差,遇到正斜杠路径、UNC路径等场景容易失效
最优解决方案
直接使用.NET内置的IO路径处理方法,原生支持任意多点点的文件名提取,无需手动处理字符串,自动覆盖绝大多数边界场景:
$sql_return_path = "C:\Documents\Test\testFileResult.v1.2.txt" # 获取目录路径,原有逻辑可保留 $filedirectory = Split-Path -Path $sql_return_path # 直接提取不带后缀的文件名,自动匹配最后一个.进行分割 $filenamenoextension = [System.IO.Path]::GetFileNameWithoutExtension($sql_return_path) # 如需获取带后缀的纯文件名,也可直接用内置方法,无需手动分割反斜杠 $filename = [System.IO.Path]::GetFileName($sql_return_path)
示例效果:针对路径C:\Test\my.file.name.with.many.dots.csv,上述代码返回的$filenamenoextension值为my.file.name.with.many.dots,完全符合需求。
手动实现的修正版
如果你需要自行用LastIndexOf实现逻辑,修正原有错误后的代码如下:
$sql_return_path = "C:\Documents\Test\testFileResult.v1.2.txt" $fileparts = $sql_return_path.Split("\") $filename = $fileparts[-1] # 找到最后一个.的位置 $lastDotIndex = $filename.LastIndexOf(".") # 兼容无后缀、点开头的特殊文件名场景 $filenamenoextension = switch ($lastDotIndex) { -1 { $filename } # 文件名无后缀,直接返回 0 { $filename } # 是.gitignore这类点开头的隐藏文件,直接返回 default { $filename.Substring(0, $lastDotIndex) } # 正常截取最后一个点之前的内容 }
内容的提问来源于stack exchange,提问作者bubbles
相关产品推荐
相关产品推荐

