为什么我不能在会话打开时添加 FileTransferProgress 处理程序?
Why can I not add a FileTransferProgress handler while the session is open?
我有一个非常的基本功能,因此可以将远程文件夹同步到本地。这与 FileTransferred
处理程序配合使用效果很好,我想将 FileTransferProgress
添加到组合中,然后使用 Write-Progress
。但是我无法做到这一点,因为在会话打开时我似乎无法添加 FileTransferProgress
处理程序。
function Sync-RemoteToLocalFolder{
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[WinSCP.Session]$Session,
[Parameter(Position=0)]
[string]$RemotePath="/",
[Parameter(Position=1,mandatory)]
[string]$LocalPath
)
$fileTransferedEvent = {Invoke-FileTransferredEvent $_}
# Determine how many files are in this folder tree
$fileCount = (Get-WinSCPItems -Session $Session -RemotePath $RemotePath | Where-Object{$_.IsDirectory -eq $false}).Count
$fileProgressEvent = {Invoke-FileProgressEvent $_ $fileCount}
try{
# Set the file transfer event handler
Write-Verbose "Setting Transfered handler"
$session.add_FileTransferred($fileTransferedEvent)
# Set the transfer progress handler
Write-Verbose "Setting Progress handler"
$Session.add_FileTransferProgress($fileProgressEvent)
# Sync the directories
Write-Verbose "Syncronizing '$LocalPath' with '$RemotePath'"
$synchronizationResult = $session.SynchronizeDirectories([WinSCP.SynchronizationMode]::Local, $LocalPath, $RemotePath, $False)
# Check the result for errors
$synchronizationResult.Check()
# Remove the handlers from the session
$session.remove_FileTransferred($fileTransferedEvent)
$Session.remove_FileTransferProgress($fileProgressEvent)
}catch [Exception]{
Write-Error $_
}
}
如果我 运行 这个,打开 $session
通过,然后我收到消息 Sync-RemoteToLocalFolder : Session is already opened
。我发现这很奇怪,因为我即时添加了一种不同类型的处理程序,但它们的功能可能不同。所以我可以注释掉关于 FileTransferProgress
的两行并且上面的函数可以按我想要的方式工作(有一些逻辑缺陷但它们存在于这个问题之外,例如我需要更新 [= 的脚本块18=]).
为什么我不能在会话打开时添加 FileTransferProgress
处理程序?
这是实施的限制。
对此您无能为力。
The event has to be subscribed before calling Open
.
作为解决方法,您可以在事件处理程序中引入一个标志,以将其关闭。
我有一个非常的基本功能,因此可以将远程文件夹同步到本地。这与 FileTransferred
处理程序配合使用效果很好,我想将 FileTransferProgress
添加到组合中,然后使用 Write-Progress
。但是我无法做到这一点,因为在会话打开时我似乎无法添加 FileTransferProgress
处理程序。
function Sync-RemoteToLocalFolder{
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[WinSCP.Session]$Session,
[Parameter(Position=0)]
[string]$RemotePath="/",
[Parameter(Position=1,mandatory)]
[string]$LocalPath
)
$fileTransferedEvent = {Invoke-FileTransferredEvent $_}
# Determine how many files are in this folder tree
$fileCount = (Get-WinSCPItems -Session $Session -RemotePath $RemotePath | Where-Object{$_.IsDirectory -eq $false}).Count
$fileProgressEvent = {Invoke-FileProgressEvent $_ $fileCount}
try{
# Set the file transfer event handler
Write-Verbose "Setting Transfered handler"
$session.add_FileTransferred($fileTransferedEvent)
# Set the transfer progress handler
Write-Verbose "Setting Progress handler"
$Session.add_FileTransferProgress($fileProgressEvent)
# Sync the directories
Write-Verbose "Syncronizing '$LocalPath' with '$RemotePath'"
$synchronizationResult = $session.SynchronizeDirectories([WinSCP.SynchronizationMode]::Local, $LocalPath, $RemotePath, $False)
# Check the result for errors
$synchronizationResult.Check()
# Remove the handlers from the session
$session.remove_FileTransferred($fileTransferedEvent)
$Session.remove_FileTransferProgress($fileProgressEvent)
}catch [Exception]{
Write-Error $_
}
}
如果我 运行 这个,打开 $session
通过,然后我收到消息 Sync-RemoteToLocalFolder : Session is already opened
。我发现这很奇怪,因为我即时添加了一种不同类型的处理程序,但它们的功能可能不同。所以我可以注释掉关于 FileTransferProgress
的两行并且上面的函数可以按我想要的方式工作(有一些逻辑缺陷但它们存在于这个问题之外,例如我需要更新 [= 的脚本块18=]).
为什么我不能在会话打开时添加 FileTransferProgress
处理程序?
这是实施的限制。
对此您无能为力。
The event has to be subscribed before calling
Open
.
作为解决方法,您可以在事件处理程序中引入一个标志,以将其关闭。