如何从 WinSCP 会话对象中删除 FileTransferred 事件处理程序?
How can I remove a FileTransferred event handler from a WinSCP Session object?
我为满足我需要的 WinSCP 模块制作了一个小型 PowerShell 包装脚本。 Like in the example for synchronizing local and remote folders 我的使用文件传输事件来记录会话事件。
$fileTransferedEvent = {Receive-FileTransferredEvent $_}
$session.add_FileTransferred($fileTransferedEvent)
该示例在完成后处理会话。我的逻辑使会话保持打开状态,直到我选择完成它,以便我可以在其他 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)
第一个片段添加了两个 distinct 事件处理程序,而后者添加了两个 相同 处理程序。
在第一个片段之后,您不能通过调用以下方法删除两个注册:
$session.remove_FileTransferred($fileTransferedEvent)
$session.remove_FileTransferred($fileTransferedEvent)
第一个 "remove" 将删除 last/second 添加的处理程序。第二个 "remove" 什么都不做,因为它试图删除已经取消的同一个处理程序。由于您没有对第一个处理程序的任何引用,因此无法再取消它。
我为满足我需要的 WinSCP 模块制作了一个小型 PowerShell 包装脚本。 Like in the example for synchronizing local and remote folders 我的使用文件传输事件来记录会话事件。
$fileTransferedEvent = {Receive-FileTransferredEvent $_}
$session.add_FileTransferred($fileTransferedEvent)
该示例在完成后处理会话。我的逻辑使会话保持打开状态,直到我选择完成它,以便我可以在其他 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)
第一个片段添加了两个 distinct 事件处理程序,而后者添加了两个 相同 处理程序。
在第一个片段之后,您不能通过调用以下方法删除两个注册:
$session.remove_FileTransferred($fileTransferedEvent)
$session.remove_FileTransferred($fileTransferedEvent)
第一个 "remove" 将删除 last/second 添加的处理程序。第二个 "remove" 什么都不做,因为它试图删除已经取消的同一个处理程序。由于您没有对第一个处理程序的任何引用,因此无法再取消它。