gpt4 book ai didi

powershell - 如何从 WinSCP session 对象中删除 FileTransferred 事件处理程序?

转载 作者:行者123 更新时间:2023-12-02 23:23:02 27 4
gpt4 key购买 nike

我为适合我需要的 WinSCP 模块制作了一个小的 PowerShell 包装脚本。 Like in the example for synchronizing local and remote folders我的使用文件传输事件来记录 session 事件。

$fileTransferedEvent = {Receive-FileTransferredEvent $_}
$session.add_FileTransferred($fileTransferedEvent)

该示例在完成后处理 session 。我的逻辑保持 session 打开,直到我选择完成它,以便我可以在其他 cmdlet 调用中使用相同的 session 。

如果其他 cmdlet(甚至再次调用相同的 cmdlet)也使用 add_FileTransferred(),则会产生问题。 .再次添加事件,触发 X 次输出,其中 X 是调用方法的次数。

我找到了一个名为 remove_FileTransferred() 的合作伙伴方法但我不知道如何使用它

Name                   MemberType Definition                                                           
---- ---------- ----------
add_FileTransferred Method void add_FileTransferred(WinSCP.FileTransferredEventHandler value)
remove_FileTransferred Method void remove_FileTransferred(WinSCP.FileTransferredEventHandler value)

它们都接受相同的值,所以我想也许我可以将处理程序的定义传递给它,但这似乎不起作用,即 $session.remove_FileTransferred($fileTransferedEvent)没有做这项工作。它也不会出错。

如何删除 Winscp.Session 上的文件传输事件处理程序对象?

最佳答案

这对我来说非常有用:

$fileTransferedEvent = { Write-Host "Upload of $($_.FileName) succeeded" }
$session.add_FileTransferred($fileTransferedEvent)
$session.PutFiles("C:\test.txt", "/").Check()
$session.remove_FileTransferred($fileTransferedEvent)
$session.PutFiles("C:\test.txt", "/").Check()

我得到:

Upload of C:\test.txt succeeded

而如果我不调用 remove_FileTransferred ,我得到了两次输出,正如预期的那样:

Upload of C:\test.txt succeeded
Upload of C:\test.txt succeeded

引用 Event handlers in PowerShell .

如果您多次添加相同的事件处理程序,则每次引发事件时都会调用该处理程序多次。如果要取消事件订阅,则必须以相同的次数删除处理程序。删除未(或不再)添加的处理程序是 noop。所有这些都是一般规则,不限于 Session.FileTransferred或 WinSCP .NET 程序集。

例子:
$fileTransferedEvent = { Write-Host "Upload of $($_.FileName) succeeded" }
$session.add_FileTransferred($fileTransferedEvent)
$session.add_FileTransferred($fileTransferedEvent)

Write-Host "two handlers:"
$session.PutFiles("C:\test.txt", "/").Check()

$session.remove_FileTransferred($fileTransferedEvent)
Write-Host "one handler:"
$session.PutFiles("C:\test.txt", "/").Check()

$session.remove_FileTransferred($fileTransferedEvent)
Write-Host "zero handlers:"
$session.PutFiles("C:\test.txt", "/").Check()

Write-Host "done"

这会让你:

two handlers:
Upload of C:\test.txt succeeded
Upload of C:\test.txt succeeded
one handler:
Upload of C:\test.txt succeeded
zero handlers:
done

不过,可能不明显的是,以下两个代码片段并不相同:
$fileTransferedEvent = { Write-Host "Upload of $($_.FileName) succeeded" }
$session.add_FileTransferred($fileTransferedEvent)
$fileTransferedEvent = { Write-Host "Upload of $($_.FileName) succeeded" }
$session.add_FileTransferred($fileTransferedEvent)
$fileTransferedEvent = { Write-Host "Upload of $($_.FileName) succeeded" }
$session.add_FileTransferred($fileTransferedEvent)
$session.add_FileTransferred($fileTransferedEvent)

第一个片段添加了两个 独特的事件处理程序,而后者添加两个 相同 处理程序。

在第一个片段之后,您不能通过调用以下命令来删除两个注册:
$session.remove_FileTransferred($fileTransferedEvent)
$session.remove_FileTransferred($fileTransferedEvent)

第一个“删除”将删除最后/第二个添加的处理程序。第二个“删除”不会做任何事情,因为它试图删除已经取消的同一个处理程序。由于您没有对第一个处理程序的任何引用,因此您不能再取消它。

关于powershell - 如何从 WinSCP session 对象中删除 FileTransferred 事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44315790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com