Powershell:每次从函数运行时都会添加数据的函数

问题描述

我知道我做错了事,但是我被卡住了……我正在通过串行连接到Cisco设备,然后每次发送命令时,我都可以通过键入$port.ReadExisting()来读取输出。我需要能够运行许多命令,填充缓冲区,然后从端口获取输出。我必须检查以确保首先要阅读一些东西,这就是为什么我将其放在可以被一遍又一遍调用函数中的原因。

每次调用时,$Comreply都会被清除。我该如何获取Comreply中的内容添加$port.ReadExisting(),并让Comreply吐出所有已写的内容?...

Function WaitForReply {
    while ($port.BytesToRead -gt 0){
        $Comreply += $($port.ReadExisting()) + "`n"
    }
}

我还应该如何调用我的函数?...我应该只用WaitForReply调用它吗?还是应该用$AllMyReplies = WaitForReply设置一个等于它的变量?

解决方法

这是由于在与其他scope中的变量进行交互时PowerShell的写时复制行为。

如果在变量名前加上$COMReplyscript:范围限定符(即{{1 }}。

...但是解决此问题的 real 方法是避免读取,更重要的是写入跨范围变量边界。

为避免这种情况,您需要:

  1. 将所有需要的输入声明为参数
  2. 按原样输出结果,而不是写入函数外部的变量

如果这样做,我们将得到如下结果:

global:

这为我们的函数提供了一个很好的 clean 表面-该函数不依赖于能够从调用范围中发现$script:COMReply += ...,并且function Wait-ForReply($Port){ while($Port.BytesToRead -gt 0){ $Port.ReadExisting() } } 不受什么影响继续在函数内部。

现在,您只需执行以下操作即可在调用范围中添加或连接到$port

$COMReply