簡體   English   中英

如何將 append stream 的數據分配給 PowerShell 中的變量而不是文件

[英]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.

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