从Powershell中的外部命令输出中提取模式

时间:2013-08-06 15:27:46

标签: 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。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

您可以使用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 class的实例。要仅检索匹配的数字,请访问Value集合的第一个元素的Matches属性:

eraseDevice `
    | Select-Object -First 1 `
    | Select-String -Pattern '0x[0-9a-f]{8}' `
    | ForEach-Object { $_.Matches[0].Value };

请注意,如果您确实要从所有输出行中提取扇区号,则只需从管道中删除Select-Object,并保持命令的其余部分不被修改。

答案 1 :(得分:1)

$r = [regex] "(0x[0-9a-f]+)"
$line = (eraseDevice | select -first 1)
$num = $r.match($line).groups[1].value