PowerShell中截取ExpandProperty返回值指定字符串段的方法
问题描述
需要从PowerShell中Select-Object -ExpandProperty CommandLine返回的内容里提取特定片段:移除--device之前和mapserver之后的所有字符,最终输出--device-scale-factor-mapserver。
尝试过以下代码,但$str.Split('--device')[-1]未达到预期效果:
$str = Get-CimInstance -ClassName Win32_Process -Filter "ProcessId = '14840'" | Select-Object -ExpandProperty CommandLine $str.CommandLine $str.Split('--device')[-1] $str
当前获取的CommandLine原始内容如下:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --type=renderer --disable-nacl --origin-trial-disabled-features=WebGPU --lang=en-US --device-scale-factor-mapserver=1 --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=69 --time-ticks-at-unix-epoch=-170003960238778825810279 --launch-time-ticks=11174444444170 88642 --mojo-platform-channel-handle=7412 --field-trial-handle=1960,i,183ds1827975sd7468sss406768,131sdsd35554053270777202,262144 /prefetch:1
解决方案
方法1:正则表达式精准提取
用正则匹配直接定位目标片段,是最简洁可靠的方式:
$str = Get-CimInstance -ClassName Win32_Process -Filter "ProcessId = '14840'" | Select-Object -ExpandProperty CommandLine # 匹配以 --device 开头、直到 mapserver 结尾的连续内容 if ($str -match '--device.*?mapserver') { $matches[0] }
执行后直接输出目标结果:--device-scale-factor-mapserver
方法2:分步拆分截断
如果偏好不用正则,可以分步处理:
$str = Get-CimInstance -ClassName Win32_Process -Filter "ProcessId = '14840'" | Select-Object -ExpandProperty CommandLine # 拆分出 --device 之后的部分 $afterDevice = $str.Split('--device')[-1] # 截取到 mapserver 为止的内容,再拼接回 --device $mapserverPos = $afterDevice.IndexOf('mapserver') $result = '--device' + $afterDevice.Substring(0, $mapserverPos + 'mapserver'.Length) $result
原代码失效原因
之前的$str.Split('--device')[-1]仅获取了--device之后的全部内容,但没有截断mapserver后面的字符,所以得到的是包含=1及后续参数的长串,需要进一步截取才能得到目标片段。
内容的提问来源于stack exchange,提问作者Behseini
相关产品推荐
相关产品推荐

