[英]Extracting a pattern from output of an external command in Powershell
对于我的powershell脚本,我运行一个外部命令并在输出中查找特定的模式。 例如:
命令“ eraseDevice”给我这样的输出:
Erasing Deployment... Erasing sector 0x080a8000
Erasing sector 0x080c1000
Erasing sector 0x080e1000
Erasing sector 0x64010000
Rebooting...
我希望此输出中的数字为0x080a8000。 我尝试了以下方法:
eraseDevice | select-string -simplematch -pattern 0x
返回包含十六进制数字的行。 我也尝试执行以下操作,但是所有这些都返回错误:
eraseDevice | select-string -simplematch -pattern 0x -totalcount 1
eraseDevice | (select-string -simplematch -pattern 0x)[4]
eraseDevice | (select-string -simplematch -pattern 0x).split()[4]
所需的输出:第一行的0x080a8000。 谢谢你的帮助。
您可以使用Select-Object
来仅获取eraseDevice
的第一行输出:
eraseDevice | Select-Object -First 1;
然后,将其通过管道传递到Select-String
以查找'0x'
后跟正好是八个十六进制字符:
eraseDevice | Select-Object -First 1 | Select-String -Pattern '0x[0-9a-f]{8}'
Select-String
返回MatchInfo
类的实例。 要仅检索匹配的数字,请访问Matches
集合的第一个元素的Value
属性:
eraseDevice `
| Select-Object -First 1 `
| Select-String -Pattern '0x[0-9a-f]{8}' `
| ForEach-Object { $_.Matches[0].Value };
请注意,如果您确实想从输出的所有行中提取扇区号,则只需从管道中删除Select-Object
,然后保留其余命令不变。
$r = [regex] "(0x[0-9a-f]+)"
$line = (eraseDevice | select -first 1)
$num = $r.match($line).groups[1].value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.