2 Câu hỏi: trích xuất giá trị giữa hai dấu ngoặc vuông

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi cần trích xuất giá trị giữa hai dấu ngoặc vuông từ một dòng cụ thể trong đầu ra lệnh. Đây là đầu ra của lệnh.

C:\Informatica\PowerCenter\isp\bin> .\infacmd.bat ping -dn Infadomain -nn Node01
[INFACMD_10052] Node [Node01] Domain [Infadomain] Host:Port [infadev:6005] was successfully pinged.
[INFACMD_10470] Kerberos authentication is [disabled] and secure communication is [disabled] in the Informatica domain [Infadomain].
Command ran successfully.

Từ đầu ra trên, tôi cần trích xuất giá trị 'infadev' từ kết quả lệnh trên. Tôi đã thử các hàm regex để trích xuất giá trị nhưng bằng cách nào đó mã không hoạt động.

$cmd = Invoke-Command -ScriptBlock {& cmd.exe /c "infacmd.bat ping" -dn "Infadomain" -nn "Node01"}  | Where-Object {$_ -ne 'Command ran successfully.'}
$result = $cmd |(\[(?:\[??[^\[]*?\]))
write-host $result
  

Tại dòng: 2 char: 17 + $result = $cmd | ([(?: [?? [^ [] *?])) + ~~~~~~~~~~~~~~~ ~~~~~ ~ Biểu thức chỉ được phép là phần tử đầu tiên của đường ống. + CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException + FullQualifiedErrorId: ExpressionsMustBeFirstInPipeline

invoke-command -ScriptBlock {& cmd.exe /c "infacmd.bat ping" -dn "InfaDomain" -nn "Node01"} | Where-Object {$_ -ne 'Command ran successfully.'}
    
0
  1. Bạn đang nhận được sản lượng nào?
    2019-05-08 16: 28: 28Z
  2. Tại dòng: 2 char: 17 + $result = $cmd | ([(?: [?? [^ [] *?])) + ~~~ ~~~~~~~~~~~~~~~~~~~ Biểu thức chỉ được phép là yếu tố đầu tiên của đường ống. + CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException + FullQualifiedErrorId: ExpressionsMustBeFirstInPipeline
    2019-05-08 16: 41: 44Z
  3. Đừng đưa thông tin vào bình luận, chỉnh sửa câu hỏi lần sau chính bạn
    2019-05-08 16: 56: 12Z
  4. $cmd xác định đầu ra mà bạn dẫn đến CÁI GÌ ? Biểu thức chính quy cần một toán tử và dấu ngoặc kép.
    2019-05-08 16: 58: 33Z
  5. infadev: luôn là một phần của khối đó? nếu vậy, nó làm cho mọi thứ nhiều đơn giản hơn. [ cười ]
    2019-05-08 17: 36: 51Z
2 Câu trả lời                              2                         

đây là một ý tưởng khác. [ grin ] nó sử dụng nhóm chụp có tên để lấy bộ dữ liệu được đặt trong ngoặc đầu tiên sau văn bản Host:Port.

$Cmd = @'
[INFACMD_10052] Node [Node01] Domain [Infadomain] Host:Port [infadev:6005] was successfully pinged.
[INFACMD_10470] Kerberos authentication is [disabled] and secure communication is [disabled] in the Informatica domain [Infadomain].
Command ran successfully.
'@ -split [environment]::NewLine

$Null = $Cmd.ForEach({$_ -match 'Host:Port \[(?<HostPortInfo>.+)\]'})

$Matches.HostPortInfo

đầu ra ...

infadev:6005
    
0
2019-05-08 20: 30: 57Z

Bạn có thể sử dụng Where -match để nhận được nhiều kết quả, hơn là sử dụng $Matches[i].

$cmd = Invoke-Command -ScriptBlock {& cmd.exe /c "infacmd.bat ping" -dn "Infadomain" -nn "Node01"}  | Where-Object {$_ -ne 'Command ran successfully.'}
$cmd | Where {$_ -match "(\[(?:\[??[^\[]*?\]))" }

$result0 = $Matches[0]
$result1 = $Matches[1]
...
    
0
2019-05-08 17: 05: 17Z
nguồn đặt đây