对于我的 powershell 脚本,我运行外部命令并在输出中查找特定模式。例如:
命令“eraseDevice”给我这样的输出:
Erasing Deployment... Erasing sector 0x080a8000
Erasing sector 0x080c1000
Erasing sector 0x080e1000
Erasing sector 0x64010000
Rebooting...
Run Code Online (Sandbox Code Playgroud)
我想要此输出中的数字 0x080a8000。我已经尝试过以下方法:
eraseDevice | select-string -simplematch -pattern 0x
Run Code Online (Sandbox Code Playgroud)
它返回包含十六进制数的行。我也尝试执行以下操作,但它们都返回错误:
eraseDevice | select-string -simplematch -pattern 0x -totalcount 1
eraseDevice | (select-string -simplematch -pattern 0x)[4]
eraseDevice | (select-string -simplematch -pattern 0x).split()[4]
Run Code Online (Sandbox Code Playgroud)
所需的输出:第一行的 0x080a8000。感谢您的帮助。
您可以使用Select-Object以下方式仅获取第一行输出eraseDevice:
eraseDevice | Select-Object -First 1;
Run Code Online (Sandbox Code Playgroud)
然后通过管道将其输入Select-Stringfind中'0x',后跟八个十六进制字符:
eraseDevice | Select-Object -First 1 | Select-String -Pattern '0x[0-9a-f]{8}'
Run Code Online (Sandbox Code Playgroud)
Select-String返回该类的MatchInfo实例。要仅检索匹配的数字,请访问Value集合的第一个元素的属性Matches:
eraseDevice `
| Select-Object -First 1 `
| Select-String -Pattern '0x[0-9a-f]{8}' `
| ForEach-Object { $_.Matches[0].Value };
Run Code Online (Sandbox Code Playgroud)
请注意,如果您确实想从所有输出行中提取扇区号,则可以Select-Object从管道中删除并保留命令的其余部分不变。