簡體   English   中英

從Powershell中的外部命令輸出中提取模式

[英]Extracting a pattern from output of an external command in 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。 謝謝你的幫助。

您可以使用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類的實例。 要僅檢索匹配的數字,請訪問Matches集合的第一個元素的Value屬性:

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

請注意,如果您確實想從輸出的所有行中提取扇區號,則只需從管道中刪除Select-Object ,然后保留其余命令不變。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM