2

对于我的 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。谢谢你的帮助。

4

2 回答 2

5

您可以使用Select-Object仅从以下位置获取第一行输出eraseDevice

eraseDevice | Select-Object -First 1;

然后将其输入Select-String到 find'0x'后面正好是八个十六进制字符:

eraseDevice | Select-Object -First 1 | Select-String -Pattern '0x[0-9a-f]{8}'

Select-StringMatchInfo返回类的实例。要仅检索匹配的数字,请访问集合Value的第一个元素的属性Matches

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

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

于 2013-08-06T15:41:53.643 回答
1
$r = [regex] "(0x[0-9a-f]+)"
$line = (eraseDevice | select -first 1)
$num = $r.match($line).groups[1].value
于 2013-08-06T15:41:56.257 回答