如何用PowerShell Match解析User-Agent字符串获取浏览器与系统信息
解析User-Agent提取浏览器与操作系统信息(PowerShell)
为什么Chrome的User-Agent里有Safari标识?
这是历史兼容逻辑导致的:早期大量网站仅识别Mozilla内核的浏览器,Chrome这类基于WebKit/Blink内核的浏览器,会在UA字符串中保留AppleWebKit和Safari标识——本质是为了让老网站判定它为兼容的Safari内核浏览器,避免被拒绝服务。这些标识是内核层面的兼容标记,并非Chrome基于Safari开发,只是借UA字符串适配旧的网站检测逻辑。
PowerShell解析方案
方案1:用现成模块(推荐,更可靠)
直接使用专门的UserAgentParser模块,无需自己编写复杂正则,解析逻辑更完善:
- 安装模块(普通用户权限可加
-Scope CurrentUser):
Install-Module -Name UserAgentParser -Scope CurrentUser -Force
- 解析示例:
$uaList = @( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", "Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36", "Home Assistant/2023.1.1-3124 (Android 13; SM-G991B)" ) foreach ($ua in $uaList) { $result = Parse-UserAgent -UserAgentString $ua [PSCustomObject]@{ UserAgent = $ua OS = "$($result.OS.Name) $($result.OS.Version) $(if($result.Device.Model){"($($result.Device.Model))"})" Browser = "$($result.Browser.Name) $($result.Browser.Version)" } }
执行后会输出结构化的OS和浏览器信息,比如第一个UA会返回Windows 10.0 (Win64; x64)和Chrome 110.0.0.0。
方案2:自定义正则表达式
如果不想依赖模块,可以针对目标UA编写精准正则,避免匹配无关的兼容标识:
提取操作系统信息
先匹配括号内的系统描述,再细分不同系统类型:
$osRegex = '\((?<OSInfo>[^)]+)\)' $chromeUa = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" if ($chromeUa -match $osRegex) { $osRaw = $matches['OSInfo'] # 解析Windows信息 if ($osRaw -match 'Windows NT (?<Version>[\d.]+); (?<Arch>.+)') { Write-Host "OS: Windows $($matches.Version), 架构: $($matches.Arch)" } # 解析Android信息 elseif ($osRaw -match 'Linux; Android (?<Version>[\d.]+); (?<Model>.+)') { Write-Host "OS: Android $($matches.Version), 设备: $($matches.Model)" } }
提取浏览器信息
优先匹配真实客户端标识(如Chrome、Home Assistant),跳过Mozilla、AppleWebKit这类兼容标记:
$browserRegex = '(Chrome|Home Assistant)\/(?<Version>[\d.-]+)' foreach ($ua in $uaList) { if ($ua -match $browserRegex) { Write-Host "浏览器: $($matches[1]) $($matches.Version)" } }
关于你之前的正则问题
你使用的正则会匹配到第一个符合条件的片段(即Mozilla/5.0),因为PowerShell的-match默认仅返回第一个匹配结果。即便用Select-String -AllMatches获取所有匹配,这类通用正则也会捕获大量无关内容,不如针对OS和浏览器分别编写定向正则高效。
内容的提问来源于stack exchange,提问作者PlasmatikSteak
相关产品推荐
相关产品推荐

