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

Sar*_*api 2 powershell

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

BAC*_*CON 5

您可以使用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从管道中删除并保留命令的其余部分不变。