问题描述
我知道我做错了事,但是我被卡住了……我正在通过串行连接到Cisco设备,然后每次发送命令时,我都可以通过键入$port.ReadExisting()
来读取输出。我需要能够运行许多命令,填充缓冲区,然后从端口获取输出。我必须检查以确保首先要阅读一些东西,这就是为什么我将其放在可以被一遍又一遍调用的函数中的原因。
每次调用时,$Comreply
都会被清除。我该如何获取Comreply
中的内容,添加$port.ReadExisting()
,并让Comreply
吐出所有已写的内容?...
Function WaitForReply {
while ($port.BytesToRead -gt 0){
$Comreply += $($port.ReadExisting()) + "`n"
}
}
我还应该如何调用我的函数?...我应该只用WaitForReply
来调用它吗?还是应该用$AllMyReplies = WaitForReply
设置一个等于它的变量?
解决方法
这是由于在与其他scope中的变量进行交互时PowerShell的写时复制行为。
如果在变量名前加上$COMReply
或script:
范围限定符(即{{1 }}。
...但是解决此问题的 real 方法是避免读取,更重要的是写入跨范围变量边界。
为避免这种情况,您需要:
- 将所有需要的输入声明为参数
- 按原样输出结果,而不是写入函数外部的变量
如果这样做,我们将得到如下结果:
global:
这为我们的函数提供了一个很好的 clean 表面-该函数不依赖于能够从调用范围中发现$script:COMReply += ...
,并且function Wait-ForReply($Port){
while($Port.BytesToRead -gt 0){
$Port.ReadExisting()
}
}
不受什么影响继续在函数内部。
现在,您只需执行以下操作即可在调用范围中添加或连接到$port
:
$COMReply