![](/img/trans.png)
[英]How to append last field of a line in a file to a variable on powershell cli?
[英]How to assign and append stream of data to a variable in PowerShell as opposed to a file
使用 PowerShell,如何將生成連續“數據流”的命令的 append 和 append 分配給 memory 中的變量而不是文件?
我正在嘗試編寫一個腳本來捕獲返回到客戶端設備的 DHCP Offer 數據包。 當我在 PowerShell 本地一一發出以下命令時(同時在同一客戶端設備上執行 DHCP 發現數據包生成器):
pktmon filter add -t udp -p 68
pktmon start --etw --log-mode real-time | Select-String ".67 > 255.255.255.255.68"
預期的 output 顯示在控制台上。 我必須按 CTRL+C 才能退出。
PS C:\Test> pktmon start --etw --log-mode real-time | Select-String ".67 > 255.255.255.255.68" | Select-String -notmatch "ssap SNAP"
E0-CB-BC-2A-C7-20 > FF-FF-FF-FF-FF-FF, ethertype IPv4 (0x0800), length 342: 10.0.0.254.67 > 255.255.255.255.68: UDP, length 300
E0-CB-BC-2A-C7-20 > FF-FF-FF-FF-FF-FF, ethertype IPv4 (0x0800), length 342: 10.0.0.254.67 > 255.255.255.255.68: UDP, length 300
E0-CB-BC-2A-C7-20 > FF-FF-FF-FF-FF-FF, ethertype IPv4 (0x0800), length 342: 10.0.0.254.67 > 255.255.255.255.68: UDP, length 300
E0-CB-BC-2A-C7-20 > FF-FF-FF-FF-FF-FF, ethertype IPv4 (0x0800), length 342: 10.0.0.254.67 > 255.255.255.255.68: UDP, length 300
E0-CB-BC-2A-C7-20 > FF-FF-FF-FF-FF-FF, ethertype IPv4 (0x0800), length 342: 10.0.0.254.67 > 255.255.255.255.68: UDP, length 300
但是當我將相同的命令添加到腳本中的變量時:
pktmon filter add -t udp -p 68 | Out-Null
Write-Host "Detecting DHCP Servers...." -ForegroundColor Green
$result = pktmon start --etw --log-mode real-time | Select-String ".67 > 255.255.255.255.68" | Select-String -notmatch "ssap SNAP"
$result
pktmon stop | Out-Null
pktmon filter remove | Out-Null
該腳本運行並完成,沒有任何 output,也沒有任何錯誤。 將它附加到文本文件時我沒有問題。 我假設該行:
$result = pktmon start --etw --log-mode real-time | Select-String ".67 > 255.255.255.255.68" | Select-String -notmatch "ssap SNAP" | Out-Null
不會等待接收到數據並將其存儲在$result
變量中,腳本會立即執行后面的代碼行。
請原諒我,因為這是我的第一個 PowerShell 腳本。 我曾嘗試搜索論壇,但顯然我沒有使用正確的術語。
- 更新 -
簡單地添加| Write-Output
| Write-Output
來捕獲變量對我有用。
$result = pktmon start --etw --log-mode real-time | Select-String ".67 > 255.255.255.255.68" | Select-String -notmatch "ssap SNAP" | Write-Output
謝謝
嘗試從 PowerShell 中的本機二進制文件中捕獲 output 有時會很棘手。
使用這一行(如下),您將丟棄 output 到 NULL,因此它永遠不會存儲在$result
變量中。
$result = pktmon start --etw --log-mode real-time | Select-String ".67 > 255.255.255.255.68" | Select-String -notmatch "ssap SNAP" | Out-Null
我建議刪除| Out-Null
此行末尾的| Out-Null
,它應該將 output 放入$result
變量中。
如果將 pipe 移除到Out-Null
仍然無法將 output 從pktmon
捕獲到$result
變量,您可以嘗試使用 function ,如Invoke-NativeCommand
。 這個 function 很好,因為它也可以將本機命令 output 流重定向到所需的 PowerShell output stream。
$result = (Invoke-NativeCommand pktmon start --etw --log-mode real-time) | Select-String ".67 > 255.255.255.255.68" | Select-String -notmatch "ssap SNAP"
如果您不想使用 function 並希望嘗試保持“香草”狀態,請參閱此問題如何從 PowerShell 中的外部進程將 output 捕獲到變量中? .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.