Powershell中Select-String提取文件名未得到预期结果该如何解决?
问题原因分析
核心问题1:对Select-String的返回逻辑理解有误
Select-String默认返回包含匹配项的完整输入行,而非正则表达式实际捕获到的片段。你去掉-NotMatch参数后返回完整路径,正是因为路径中存在.*\\的匹配项,所以命令返回了整个输入字符串,而非你预期的C:\Users\User\Desktop\这段匹配内容。
核心问题2:-NotMatch参数的用法不符合需求
-NotMatch的作用是返回完全不存在指定正则匹配的输入对象。你传入的路径C:\Users\User\Desktop\test.exe明显包含.*\\的匹配结果,所以添加-NotMatch后自然返回空值,属于符合设计的正常表现。
正确实现方案
方案1:基于Select-String提取捕获组
修改正则添加文件名捕获组,直接提取捕获结果即可:
# 正则增加括号捕获文件名部分,取第一个捕获组的内容 (Select-String -Pattern '.*\\(.*)' -InputObject $test).Matches.Groups[1].Value
方案2:使用PowerShell原生方法(更推荐)
PowerShell内置了路径处理命令,不需要手动写正则,兼容性和可靠性更高:
# -Leaf 参数直接返回路径末尾的文件名/目录名 Split-Path $test -Leaf
内容的提问来源于stack exchange,提问作者Eric Goto
相关产品推荐
相关产品推荐

