PowerShell筛选baml文件列表排序不符预期 如何为文件名追加路径
问题相关信息
- 运行环境:PowerShell 5.1、Windows 10 专业版
- 核心疑问:执行代码获取的baml文件列表排序效果,与参考StackOverflow帖子展示的结果不一致
- 附加疑问:如何在输出文件名时同时附带其对应的完整路径?
测试所用代码
$res = Get-ChildItem -Path .\ -Filter *.baml -Recurse -File -Name | Sort-Object Name $res | ForEach-Object { [System.IO.Path]::GetFileNameWithoutExtension($_) } $res.Count
运行效果参考截图:
问题原因与解决方法
排序结果不一致的原因
你在Get-ChildItem后加了-Name参数,该参数会让命令直接返回文件的相对路径字符串,而非标准的FileInfo文件对象。此时管道传给Sort-Object Name的是字符串对象,这类对象不存在Name属性,排序逻辑会退化为按输入顺序输出,或是对整个路径字符串做文本排序,和参考帖子中直接对FileInfo对象的Name(即文件名本身)属性排序的逻辑完全不同,结果自然不一致。
同时输出文件名与完整路径的实现方法
去掉-Name参数,直接获取文件对象后再处理即可。PowerShell返回的文件对象自带对应属性,不需要手动调用.NET方法做路径处理,逻辑更简单也不容易出错。
修正后的代码如下:
# 获取所有baml文件对象,按文件名本身排序 $res = Get-ChildItem -Path .\ -Filter *.baml -Recurse -File | Sort-Object Name $res | ForEach-Object { # 同时输出无后缀文件名、对应完整路径 [PSCustomObject]@{ 无后缀文件名 = $_.BaseName 文件完整路径 = $_.FullName } } # 输出文件总数 $res.Count
如果只需要逐行输出带完整路径的无后缀文件名,把循环内的代码换成"$($_.BaseName) --- $($_.FullName)"即可,可根据实际需求调整输出格式。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

