PowerShell使用Select-String通配符匹配文件文本求助
问题根因
Select-String的-Pattern参数默认按正则规则匹配,你写的"ServerName=*"属于正则语法误用:正则里*是量词,代表匹配前一个字符(也就是等号=)0次及以上,不是文件系统通配符里「匹配任意长度任意字符」的语义,所以只能匹配到ServerName=字段本身,抓不到后面的取值。- 你之前写的固定格式正则通用性极差,硬编码了值的长度、字符类型规则,只能匹配
AAA-AAA-AA00格式的特定条目,只要等号后的值格式稍有变化就会匹配失败。 - 输出时选择
Pattern属性属于逻辑错误:这个属性存储的是你传入的匹配规则本身,不是文件里匹配到的实际文本,所以导出的结果全是你写死的规则内容,拿不到配置文件里的真实值。
修正方案
用捕获组匹配等号后的所有有效内容,直接从匹配结果中提取捕获到的真实值,修正后的脚本如下:
Get-Content c:\temp\ServerList.txt | ForEach-Object { Select-String -Path "\\$_\c$\GrAPE\config.ini" -Pattern '^ServerName=(.+)$' | ForEach-Object { [PSCustomObject]@{ Path = $_.Path ServerName = $_.Matches.Groups[1].Value.Trim() } } } | Export-Csv C:\Temp\Servername.csv -NoTypeInformation -Append
规则说明
- 正则
^ServerName=(.+)$含义:^匹配行起始位置,避免误匹配注释行里夹带的ServerName字符串(.+)为捕获组,匹配等号后1个及以上的任意字符,也就是你需要提取的实际ServerName值,末尾加.Trim()是为了自动去除值前后可能存在的多余空格$匹配行结束位置
- 移除了原脚本的
-List参数:该参数会让Select-String只返回每个文件的第一个匹配项,如果配置文件存在多组ServerName配置会漏匹配;如果你确认每个配置文件只有一个有效ServerName条目,可以加回该参数提升执行效率。
内容的提问来源于stack exchange,提问作者PapaDoc
相关产品推荐
相关产品推荐

