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