繁体   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